【问题标题】:MS Access: Compound greater than less than comparisonsMS Access:化合物大于小于比较
【发布时间】:2018-09-06 03:57:54
【问题描述】:

问题很简单:为什么这给出了错误的答案(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)

【问题讨论】:

  • in vba Date()&gt;=#3/16/2018#&gt;=Date()-30 询问 Date()&gt;= 是否是由 #3/16/2018#&gt;=Date()-30 创建的布尔值,这将返回 TRUE 或 FALSE 到第一部分,如果为 True,它将询问 Date()&gt;=1 是否错误:Date()&gt;=0

标签: sql ms-access vba ms-access-2016


【解决方案1】:

您不能在 Access 中进行复合比较!

使用上一个示例,Access 首先执行第一个比较:

Date()<=#3/16/2018#

这可能会导致TrueFalse。假设它是True

然后,Access 评估第二个比较:

True <= Date() - 30

(这是因为它们是从左到右处理的,第一个是真的)。​​

这没有多大意义,但 Access 可以将布尔值转换为数字(-1 = True,0 = False)和日期(例如,今天 = 43186,因为日期被定义为数字自 1899 年 12 月 30 日以来经过的天数)。

这意味着第二次比较的结果是:

-1 <= 43186 - 30

这当然是真的。您还会看到,如果第一个比较为假,那么第二个比较仍然为真。您的比较几乎总是会返回 true。

【讨论】:

  • 我认为我无法从它的行为中复合,但我很好奇为什么它给了我非常错误的答案而不是崩溃。非常感谢您的澄清。
  • 实际上,转换为布尔值的任何非零数值都是True-1 恰好是 True 的数字表示的硬连线值。
  • @MathieuGuindon 据我所知,将布尔值与日期进行比较会导致将两者隐式转换为数值(双精度值)。我找不到关于它的好的文档,但是 Debug.Print True &lt;= #1-1-1800# 打印 False 因为内部使用的 double 小于 -1
  • 是的。 Year(CDate(0)) 是 1899 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多