date - 数据在表中存储为 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
如此。
问题:
在查询设计中,当我在dd/mm/yyyy中指定条件时,为什么会生成mm/dd/yyyy形式的sql?
如果日期数(1-31)为 13 或以上,或者月份值和日期值相同(10 月 17 日、1 月 1 日、3 月 3 日、11 月 11 日),我只能使用 dd/mm/yyyy 格式查询日期,12 月 12 日等)。mm/dd/yyyy 仍然适用于前面提到的那些日期。不过,我无法使用 dd/mm/yyyy 查询 11 月 7 日、2 月 3 日、8 月 4 日等日期。我该如何解决这个问题?我存储日期,并直接使用表中的值作为查询中的条件。我不应该为了使用它们而改变我的日期值。
为什么我可以为 dd/mm/yyyy 格式或 mm/dd/yyyy 格式的天数超过 13 的日期编写 SQL 语句?例如,
WHERE
子句可能看起来像:WHERE DayOfMonth=#13/06/2018
或者WHERE DayOfMonth=#06/13/2018
它仍然返回相同的记录?为什么访问不强制执行特定格式?
编辑:
目前我在 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
将找不到日期值与前面解释的条件匹配的记录。
解决方案
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 语句中。
要解释为什么做出这些设计选择,请询问微软,他们编写了程序。这就是它的工作原理。
推荐阅读
- kubernetes - Kubernetes:GKE | 即使内存利用率大于/等于目标值,HPA 也不会扩展 Pod
- android - API <22 的颜色选择器中的主题属性
- android - 在 Android 中删除 Firebase 令牌
- node.js - 用户登录后处理 MEAN 堆栈应用程序中的社交媒体集成
- python - 使用 python 从同一网络上可访问的 c$ 计算机读取文本文件
- c# - 我的身份验证表单未加载 CSS
- java - 如何解决 Java 中的编码问题?
- r - 使用按列分组识别行中的差异
- reactjs - React: Unable to access and test props & state during Jest/Enzyme shallow rendering
- android - set center_horizontal for child of FrameLayout