【问题标题】:MS Access dates switching up on meMS Access 日期在我身上切换
【发布时间】:2017-04-24 09:44:54
【问题描述】:

我有一个使用 SQL Server 记录填充连续子表单的查询。当我的代码如下所示时,它会正常填充所有内容。

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE StartDate <= 42720 and EndDate >= 42720"

但是当我在末尾添加 or 条件时(见下文),我的日期突然偏移了 2! (上述查询前 2 天)。

Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE StartDate <= 42720 and EndDate >= 42720 or ID = 16801;"

我知道 MS Access 有一个奇怪的地方,它与 SQL Server 相差 2,因为它将 1900 视为闰年并且从 1 而不是 0 开始。但是为什么会在此时发生这种情况?这让我很难过。

编辑:到目前为止,没有一个答案告诉我为什么添加 ID = 条件会突然将日期解释从 SQL 更改为 Access,但是一个答案解决了该问题,因此我将其标记为已接受的答案。

【问题讨论】:

    标签: sql-server date ms-access vba


    【解决方案1】:

    首先,您的标准需要进行基本修正:

    Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= 42720 and EndDate >= 42720) or ID = 16801;"
    

    其次,您应该始终将日期指定为日期值,而不是数字,不是字符串,没有例外。因此:

    Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= #2016/12/16# and EndDate >= #2016/12/16#) or ID = 16801;"
    

    或:

    Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= DateSerial(2016,12,16) and EndDate >= DateSerial(2016,12,16) or ID = 16801;"
    

    【讨论】:

    • 我相信括号应该不会影响结果,因为and总是在or之前执行,但无论如何,同意明确的执行顺序会更好
    • 你是对的。 Between-And 先求值,然后是 Or 的两侧。
    • 所以我需要让我的 SQL 视图将日期转换为我在 VBA 中使用的日期值字符串?
    • 否,但连接到 SQL 字符串(第一个示例)中的日期值必须格式化为字符串表达式。 按原样使用来自函数的日期值(第二个示例)。
    • 忘了提到日期数字是来自 SQL。我使用了字符串连接,但我已经为这个问题简化了它。我想我会使用 StartYear、StartMonth 等,并使用您的第二个格式化方案。谢谢。
    【解决方案2】:

    试试这个:

    Me.RecordSource = "SELECT viewTask.* FROM viewTask WHERE (StartDate <= 42720 and EndDate >= 42720) or ID = 16801;"
    

    【讨论】:

      【解决方案3】:

      看起来在第一种情况下 SQL 在 SQL 服务器端评估 - 直接传递给 SQL 服务器,在这种情况下,数字在 SQL 端转换为日期,将 0 解释为 1/1/1900。 Second Select 已经先在 Access 端进行了评估,它通过 Access 规则将数字转换为日期,其中 0 是 1899 年 1 月 31 日,然后它已经通过参数中的日期传递给 SQL 服务器。您可以在这两种情况下捕获传递给 SQL 服务器的 SQL 并验证我的版本。

      因此,在使用服务器时要非常小心使用数字而不是明确的日期,因为它与 Access 有不同的转换规则。如果您不使用 SQL Pass-through 查询,您无法确定 SQL 是否会在没有在 Access 端进行额外评估的情况下传递到服务器。

      【讨论】:

        猜你喜欢
        • 2015-06-24
        • 2021-05-14
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        相关资源
        最近更新 更多