【问题标题】:Access VBA & SQL date formats访问 VBA 和 SQL 日期格式
【发布时间】:2016-03-10 13:02:02
【问题描述】:

我在 SQL 语句中遇到日期格式问题

CurrentTime = Format(CurrentTime, "dd/mm/yyyy hh:mm")
SQL = "SELECT Count([ID]) AS Booked FROM [Appointment Slots] WHERE [Appointment Slots].Time=#" & CurrentTime & "#"

这里奇怪的是,有时当我运行代码时,它会起作用。其他时候,在不更改代码的情况下,它不会,但是当我将日期格式更改为 mm/dd/yyyy hh:mm 时它会工作,然后它会工作一段时间然后停止工作,直到我将它改回 dd/ mm/yyyy hh:mm

显然,区域日期设置及其存储日期的方式出现了问题,但我无法确定解决方案。有没有办法比较独立于格式的 Access SQL 中的日期?

【问题讨论】:

  • 参数查询是一种避免日期格式问题的巧妙方法,也避免了需要为日期文字包含# 分隔符。如果查询需要一个日期参数,你只需给它一个日期值。
  • 这是我尝试过的解决方案中效果最好的,你能把它写成答案,以便我可以将其标记为接受吗?

标签: sql ms-access vba


【解决方案1】:

您应该养成使用ISO 序列 的习惯,然后nn 持续几分钟。

还要将“/”和“:”转义为真正的斜杠和冒号,否则它们将被本地化的日期和时间分隔符替换:

CurrentTime = Format(CurrentTime, "yyyy\/mm\/dd hh\:nn")

这也适用于 ADOFindFirst,而“反向”美国格式 (mm/dd/yyyy) 则不适用。

【讨论】:

  • “否则它们将被本地化的日期和时间分隔符替换” 谢谢。 “yyyy-mm-dd”格式也会受到本地化替换的影响吗?
  • 不,实际上不适用于 / 和 : 是唯一分隔符的日期。在其他地方,您也可以将点作为毫秒的分隔符,但这不是由 Access 和 VBA 本机处理的。
  • 再次感谢。我以前见过"yyyy\/mm\/dd",但从来不明白它为什么有用。由于我在美国,所以我对许多本地化细节都一无所知。 ;-)
  • 我认为在法国他们使用空格作为分隔符。这确实会导致 SQL 中发生奇怪的事情。
  • 谢谢,但这仍然不起作用。将我的区域设置重置为美国格式,然后以美国格式重新输入数据并且代码有效。此外 - HansUp 在对使用参数查询的 OP 的评论中的建议似乎也有效。
【解决方案2】:

有没有办法比较 Access SQL 中独立于 格式?

考虑在其WHERE 子句中带有参数的查询,类似于此...

WHERE [Appointment Slots].Time=[Enter Appointment Time]

您也可以在 SQL 语句的开头添加 PARAMETERS 子句,但这不是绝对必需的...

PARAMETERS [Enter Appointment Time] DateTime;

所以当查询需要一个日期/时间参数时,你只需给它一个日期/时间值。

参数查询避免了日期格式问题,也避免了在 SQL 语句中需要# 日期分隔符。

【讨论】:

    【解决方案3】:

    日期格式#....#,用于查询仅适用于美国日期格式 mm/dd/yyyy

    处理日期的最佳方法是将它们作为参数传递给查询。在这种情况下使用内部格式,它不依赖于区域设置。

    【讨论】:

    • 它也适用于 ISO 序列。并且仅使用斜线导致表达式被本地化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多