【问题标题】:Data stored as DD/MM/YYYY in table, but querying in DD/MM/YYYY doesn't work for all dates MS Access 2016数据在表中存储为 DD/MM/YYYY,但在 DD/MM/YYYY 中查询不适用于所有日期 MS Access 2016
【发布时间】:2018-06-20 14:36:24
【问题描述】:

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

我有一张桌子,叫做 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 日),我只能使用 dd/mm/yyyy 格式查询日期、3 月 3 日、11 月 11 日、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)

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

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

【问题讨论】:

    标签: date ms-access


    【解决方案1】:

    对检索到的日期值使用格式正确的字符串表达式:

    sql = sql & " WHERE t_birthday.DayOfMonth = #" & Format(rs("DayOfMonth").Value, "yyyy\/mm\/dd") & "#;"
    

    ISO 序列 yyyy-mm-dd 在任何地方都有效,所以养成使用它的习惯。

    【讨论】:

      【解决方案2】:

      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 语句中。

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

      【讨论】:

      • 请查看我的问题中的编辑部分。您会看到我查询了一个表,并在另一个查询 WHERE 子句中使用了该记录集中的值。这是正确的方法吗?
      • 使用参数,或重构该代码以使用单个查询而不是记录集。你在那儿来回转换一个字符串,正如所说,这是一个问题。参数使用方法见How do I use parameters in VBA in the different contexts in Microsoft Access?。使用 Format 格式化该日期也可以,但参数通常优于字符串连接。
      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多