为什么在 Microsoft Access 中比较日期时出现数据类型不匹配,即使我使用的是 # 分隔符?

Why am I getting a Data Type Mismatch when comparing a date in Microsoft Access even though I am using the # delimiter?

我有 table 参加过 class 的人的名字以及他们参加 class 的时间戳。这存储在 Access 中。我正在尝试获取在给定日期参加 class 的人员的姓名。我写的代码如下:

SELECT [Person Name], DateValue([Activity Start Date]) FROM [2019 Learning]
WHERE DateValue([Activity Start Date]) = #11/14/2019#

即使我要查找的日期包含在 table 中,当我 运行 查询时它会工作一秒钟然后我收到一条错误消息说

"Data type mismatch in criteria expression."

然后它将所有返回的数据更改为“#Name?”。谁能帮我解释一下为什么会出现这个错误?

DateValue() 函数错误为 null。提供替代值。可以使用Nz()函数。

DateValue(Nz([Activity Start Date], Date())) = #11/14/2019#

或者使用假定不在数据库中的日期,例如#12/31/2999#,而不是 Date()。

如果您想双重确保不捕获带有 null 的记录,请包括额外的过滤条件,但仍要在等式中处理 Null。并使用动态输入,如:

DateValue(Nz([Activity Start Date], Date())) = [Forms]![MyForm]![MyControl] AND NOT [Activity Start Date] IS NULL

而不是用值代替 Null(这可能会导致 undesired/confusing 结果,如果这些值由查询输出),另一种方法可能是避免datevaluewhere 子句中完全起作用。

由于 MS Access 中的日期时间仅仅是数值,数字的整数部分代表日期部分,小数部分代表一天的小数部分,或时间部分,您可以使用以下方法获取所有记录#11/14/2019#:

select [Person Name], datevalue([Activity Start Date])
from [2019 Learning]
where [Activity Start Date] >= #11/14/2019# and [Activity Start Date] < #11/15/2019#

此处,Null 值被自动排除,因为两个比较运算符将 return NullNull 一起提供,从而排除记录。