问题很简单:为什么这会给出错误的答案(0)
IIf(Date()>=#3/16/2018#>=Date()-30,1,0)
虽然这给出了正确答案(1)
IIf(Date()>=#3/16/2018# AND #3/16/2018#>=Date()-30,1,0)
更具体地说,在第一种情况下Access正在做什么?
这种情况更令人好奇,因为当我执行此代码时,我得到一个意想不到的答案(1)
IIf(Date()<=#3/16/2018#<=Date()-30,1,0)
答案 0 :(得分:3)
您无法在Access中进行复合比较!
使用上一个示例,Access首先执行第一次比较:
Date()<=#3/16/2018#
这可能会导致True
或False
。我们说它是True
然后,Access评估第二个比较:
True <= Date() - 30
(这是因为它们是从左到右处理的,第一个是真的)。
这没有多大意义,但是Access可以将一个布尔值强制转换为数字(-1 = True,0 = False)和一个日期(例如,今天= 43186,因为日期定义为数字自1899年至12月30日以来的几天。
这意味着第二次比较结果如下:
-1 <= 43186 - 30
这当然是对的。你还看到,如果第一个比较是假的,那么第二个比较将是真的。你的比较几乎总是会回归真实。