首页 > 解决方案 > 数据在表中存储为 DD/MM/YYYY,但在 DD/MM/YYYY 中查询不适用于所有日期 MS Access 2016

问题描述

可能有很多关于日期格式的问题,但我还没有找到类似的东西。

我有一张桌子,叫做 t_birthday。t_birthday 有一个名为“DayOfMonth”的字段,该字段当前以 dd/mm/yyyy 格式存储数据。假设我拥有的记录的日期为 01/12/2016(2016 年 12 月 1 日)。

现在,如果我使用“创建”选项卡中的“查询设计”选项创建查询,我会选择我的表 t_birthday。对于字段选项,我选择 DayOfMonth。在条件选项中,我放了=#01/12/2016#. 当我单击运行时,它会查询数据库并成功返回具有该日期的记录。

但是.. 如果我检查从这个查询设计生成的 SQL,它是这样的:

SELECT t_birthday.DayOfMonth
FROM t_birthday
WHERE (((t_birthday.DayOfMonth)=#12/1/2016#));

如果我尝试将表中的 DayOfMonth 值复制并粘贴到该查询中,它将不起作用。请注意查询中的格式是mm/dd/yyyy,但在我的表中它仍然是dd/mm/yyyy。我从来没有在我的表格中,甚至在我的电脑上碰过任何日期格式选项。当我实际使用表单创建此记录时,我有一个日期选择器,它的形式也是dd/mm/yyyy如此。

问题:

编辑:

目前我在 VBA 中运行我的查询并使用以下命令将其返回到记录集中:

Dim bdayRecords As RecordSet
Dim sql As String
sql = "SELECT t_birthday.DayOfMonth"
sql = sql & " FROM t_birthday"
sql = sql & " WHERE (((t_birthday.DayOfMonth)=#" & rs("DayOfMonth") & "#));"
bdayRecords = CurrentDb.OpenRecordset(sql)

wherers子句中的 where 是以前的记录集,其日期值存储在“DayOfMonth”中。rs 记录集以与填充 bdayRecords 完全相同的方式从不同的表中检索日期值。

bdayRecords将找不到日期值与前面解释的条件匹配的记录。

标签: datems-access

解决方案


SQL 总是使用 mm/dd/yyyy。这不取决于你如何格式化它。

您实际上从未以某种格式存储日期。您以某种格式显示日期。Access 中的所有日期都存储为双精度浮点数,其中包含自 1899 年 12 月 30 日以来经过的天数,小数为时间。日期的格式对您的 SQL 语句没有任何影响

始终在 SQL 中使用 mm/dd/yyyy 或 yyyy-mm-dd。VBA 只需要 mm/dd/yyyy。

但是,在使用明显无效的日期(例如 2018 年 13 月 1 日)时,Access 是机会主义的。因为不存在第 13 个月,所以它会将其解析为 1 月 13 日,即使它不是有效日期。

如果您使用来自其他查询的值,则应该没有任何问题,因为这些值永远不会来回转换为字符串。只有在将日期转换为字符串然后再转换回日期时才会遇到麻烦,这在查询中永远不应该这样做。

为避免在字符串之间来回转换,您可以将代码重构为单个查询,而不是从记录集中检索值并将该值插入到字符串 SQL 语句中,或者使用允许您直接使用日期值的参数在 SQL 语句中。

要解释为什么做出这些设计选择,请询问微软,他们编写了程序。这就是它的工作原理。


推荐阅读