查询 MS Access 问题中的自定义字段

Custom Field in Query for MS Access Issue

提问人:LostInSyntax 提问时间:11/14/2023 最后编辑:June7LostInSyntax 更新时间:11/14/2023 访问量:45

问:

我正在尝试将自定义字段放入查询中。我的其他 2 个已经顺利脱落,但我一辈子都无法弄清楚我错过了什么来让这个工作。我尝试了几十种不同的代码排列。如果该列中有任何内容,我尝试采用 DateDiff(“d”,Date(),[REV_PRM_DT]),如果没有,则采用 DateDiff(“d”,Date(),[X65-SCHATS])。需要注意的是,如果 [Green_Date] 中有任何内容,它应该返回“”,如果 [REV_PRM_DT] 中的值是 01/01/2055,它应该返回“”(我们使用它作为填充物,让它不出现在其他地方)。

我希望我拉了一个愚蠢的人,错过了一些明显的东西。显示不正确的行为。

我尝试过的一些例子是:

ATS 的天数:iif(([REV_PRM_DT]<>“01/01/2055”) 和 ([Green_Date] 为 null),iif(([REV_PRM_DT] 不是 null),DateDiff(“d”,Date(),[REV_PRM_DT]),DateDiff(“d”,Date(),[X65-SCHATS])),“”)

Days_to_ATS:iif(([REV_PRM_DT]<>“01/01/2055”) 和 ([Green_Date] 为 null),iif(([REV_PRM_DT] 不为 null),DateDiff(“d”,Date(),[REV_PRM_DT]),DateDiff(“d”,Date(),[X65-SCHATS])),“”)

Days_to_ATS:iif([Green_Date] 为 null,iif([REV_PRM_DT]=“01/01/2055”,“”,iif([REV_PRM_DT]=“”,DateDiff(“d”,Date(),[X65-SCHATS]),DateDiff(“d”,Date(),[REV_PRM_DT]))),“”)

SQL 访问 MS Access 2016 IIF

评论


答:

1赞 June7 11/14/2023 #1

我认为这些字段是日期/时间数据类型。由于 expression 应该返回一个数字值,因此不要返回 , return 或 0。使用 # 而不是引号作为日期分隔符。比需要的多。""Null

IIf([REV_PRM_DT] <> #01/01/2055# AND [Green_Date] Is Null, 
   IIf(Not [REV_PRM_DT] Is Null, DateDiff("d", Date(), [REV_PRM_DT]), DateDiff("d", Date(), [X65-SCHATS])), 
   Null)

或简化

IIf([REV_PRM_DT] <> #01/01/2055# AND [Green_Date] Is Null, 
   DateDiff("d", Date(), IIf(Not [REV_PRM_DT] Is Null, [REV_PRM_DT], [X65-SCHATS])), 
   Null)

Is Null是 SQL 运算符。 是 VBA 函数,但可以在 Access 查询中调用。调用 VBA 函数可能会降低性能,但可能不会明显降低。Nz()

IIf([REV_PRM_DT] <> #01/01/2055# AND [Green_Date] Is Null, 
   DateDiff("d", Date(), Nz([REV_PRM_DT], [X65-SCHATS])), 
   Null)

由于运算符,REV_PRM_DT必须<> #01/01/2005#并且Green_Date必须为 Null 才能计算 DateDiff - 如果要在任一情况为 true 时进行计算,请使用 .也许这就是你需要的:ANDOR

IIf([REV_PRM_DT] = #01/01/2055# OR Not [Green_Date] Is Null, 
   Null,
   DateDiff("d", Date(), Nz([REV_PRM_DT], [X65-SCHATS])))

评论

0赞 LostInSyntax 11/14/2023
感谢您对#与“的提醒。选取一些正常工作的字段并将其与您的建议之一融合在一起,我想出了:我们只希望在绿色日期为空且rev_prm_dt不在“停车场”(1/1/2055)时运行 DateDiff。这个问题仍然存在,但只要Rev_PRM_DT中有一些东西,它就可以正常工作。如果它为空,则保持空白。Days_to_ATS:iif([REV_PRM_DT]<>#01/01/2055# and [Green_Date] is null,IIf(Not [REV_PRM_DT] Is Null,DateDiff("d",Date(),[REV_PRM_DT]),DateDiff("d",Date(),[X65-SCHATS])),Null)
0赞 LostInSyntax 11/14/2023
做一些测试:即使它是空的,它的行为也好像 REV_PRM_DT = 01/01/2055。不知道如何克服这个问题。也不清楚为什么它不在 CHAARV 领域这样做。它们都设置为日期类型,但引用该类型的字段表现良好:Days_to_ATS: IIf([REV_PRM_DT]<>#01/01/2055#, "Not A Problem", "Problem")Receipt_to_ATS_(Days): iif([CHAARV]<>#09/09/9999# and [Green_Date] is null,IIf(Not [REV_PRM_DT] Is Null,DateDiff("d",[CHAARV],[REV_PRM_DT]),DateDiff("d",[CHAARV],[X65-SCHATS])),Null)
0赞 LostInSyntax 11/15/2023
我让它工作了!非常感谢,June7!我不确定为什么它的一部分行为不正常,但反转它似乎工作得很好:所以检查它是否 = 1/1/2055 或绿色日期不是 null 并且反转 IIF 的 true/false 部分的输出似乎现在表现得很正常。非常感谢您提供关于 # 而不是 “ 的提示,以及调整为使用 null 而不是 ””。Days_to_ATS: IIf([REV_PRM_DT]=#01/01/2055# OR NOT [Green_Date] Is Null,Null,IIf([REV_PRM_DT] Is Null,DateDiff("d",Date(),[X65-SCHATS]),DateDiff("d",Date(),[REV_PRM_DT])))
0赞 June7 11/15/2023
很高兴它起作用了。但是为什么不使用简化的 DateDiff() 表达式呢?为什么不使用 Nz()?
0赞 LostInSyntax 11/15/2023
主要是因为我了解长手方式的工作原理,并且觉得我没有时间研究非零函数,因为我以前从未使用过它。我可能会在项目的其余部分完成后进行更新,因为我喜欢学习新事物。对于公司的副总裁来说,这部分涉及严重的时间紧迫。说实话,我寻求帮助有点晚了。我不习惯不能自己暴力破解,哈哈。我对 Excel 更熟悉,但他希望将其转换为 Access,而我自 2014 年左右以来就没有玩过 Access。