【问题标题】:How to filter by date field when system date format is dd/mm/yyyy当系统日期格式为 dd/mm/yyyy 时如何按日期字段过滤
【发布时间】:2022-01-12 17:50:11
【问题描述】:

我有一份包含日期时间字段的报告。有一个表单用于收集查询的用户输入,特别是要过滤的查询的 FromTo 日期。

使用以下代码打开报表:

Dim str as String
str = "DateCreated BETWEEN #" & format(From_Date.value, "yyyy-mm-dd") & "# AND #" & DateAdd("d", 1, format(To_Date.value, "yyyy-mm-dd")) & "#"
DoCmd.OpenReport "report_name", acViewReport, WhereCondition:=str

在日期格式为 mm/dd/yyyy 或 yyyy-mm-dd 的 Windows 计算机上,查询有效。

某些用户将系统日期设置为 dd/mm/yyyy。过滤器的读数为 2021 年 8 月 11 日(2021 年 11 月 8 日),即 2021 年 8 月 11 日。

我尝试使用 format(From_Date.value, "yyyy-mm-dd") 格式化 WHERE 条件的日期输入。

Access 是否支持 dd/mm/yyyy 格式?如何按日期范围过滤?

是调整用户系统日期格式的唯一选择吗?

【问题讨论】:

  • 您需要先调用DateAdd,然后格式化结果日期。

标签: vba datetime ms-access


【解决方案1】:

始终使用参数,切勿将格式化日期连接到 SQL 字符串。

如果您在 SQL 字符串中使用格式化的日期,您将自己设置为失败,意外做错事的机会是巨大的。

Dim str as String
str = "DateCreated BETWEEN p1 AND p2"
DoCmd.SetParameter "p1", From_Date.value
DoCmd.SetParameter "p2", DateAdd("d", 1, To_Date.value)
DoCmd.OpenReport "report_name", acViewReport, WhereCondition:=str

详细了解 Access 中的参数:How do I use parameters in VBA in the different contexts in Microsoft Access?

【讨论】:

    【解决方案2】:

    您可以使用general date format codes 之一(而不是自定义格式字符串)来使用系统格式。

    Dim str as String
    str = "DateCreated BETWEEN #" & format(From_Date.value, "Long Date") & "# AND #" & DateAdd("d", 1, format(To_Date.value, "Long Date")) & "#"
    DoCmd.OpenReport "report_name", acViewReport, WhereCondition:=str
    

    【讨论】:

    • 这在任何非英语环境中都会失败,因为月份名称是本地化的。
    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2021-11-25
    • 2016-01-02
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多