【问题标题】:Access and SQL Server calculate date differentlyAccess 和 SQL Server 计算日期不同
【发布时间】:2013-05-07 14:56:36
【问题描述】:

我们有一些通用工具,除其他外,可以保存和显示日期。 它将保存为数字,例如 41247。

如果我将其转换回 Access 中的日期,我会得到 2012/12/04 - 这是正确的。
[使用 Format(41247;"General Date") 或 Format(Format("41247", "Short Date"), "Short Date")]

如果我将该数字转换回 SQL Server 中的日期,我会得到 2012/12/06 - 不正确。 我正在使用 CONVERT(datetime, CONVERT(real, 41247))

为什么会有差异,我可以在 SQL 中使用什么来修复它?

【问题讨论】:

    标签: sql sql-server tsql date ms-access


    【解决方案1】:

    所以我在从 excel 文件导入数据时遇到了这个问题。

    您有 2 天的差价有两个原因

    原因 1 在您的 SQL Server 中,1900 年 1 月 1 日是第 0 天,而在访问中是第 1 天。

    (我没有使用 Access,但是如果您在 Excel 中输入日期 1900-01-01 并将单元格格式化为数字,您将得到 1)。

    原因 2 1900 年不是闰年。 SQL Server 知道,但 Access 不知道。它认为 1900 年 2 月 29 日存在。

    在你的 SQL Server 中运行它

    SELECT DATEDIFF(dd, 0, '1900-01-01')
    SELECT DATEDIFF(dd, 0, '1900-02-28')
    SELECT DATEDIFF(dd, 0, '1900-03-01')
    

    输出将是

    0
    58 
    59
    

    但是当你尝试运行时

    SELECT DATEDIFF(dd, 0, '1900-02-29')
    

    你会得到一个错误

    The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
    

    由于这 2 个原因,您可以在 Access 中多获得 2 天时间。

    因此,对于 2012/12/04,Access 返回 41247,而 SQL Server 将为您提供 41245。

    希望对您有所帮助。

    编辑

    看看 Eric Lippert 的 cmets,他提到了他和 Joel Spolsky 的 2 篇非常有趣的博客文章。

    【讨论】:

    • 您是说当您将 Excel 中的日期值导入 SQL Server 时,SQL Server 中的结果日期是错误的?
    • 我从 Excel 导入到 C#,但我没有从 '2013-05-07' 这样的 excel 日期格式中获取日期,而是得到了一个像 41401 这样的数字,它是 1900-01 的偏移量-01。但是我你做 DATEADD(dd, 0, 41401) 你会在 SQL 中得到 2013-05-09。
    • 在一个有趣的命运转折中,Joel Spolsky 和我都有一些关于日期格式怪癖的历史。请参阅blogs.msdn.com/b/ericlippert/archive/2003/09/16/53013.aspx 和 Joel 非常有趣的文章 joelonsoftware.com/items/2006/06/16.html
    【解决方案2】:

    绝对不能保证两个不同的数据库引擎会使用相同的内部数字格式存储日期。因此,期望……是不合理的。

    • 获取访问日期/时间值,

    • 将其转换为等效的 Access 数字,然后

    • 将该数字转换为 SQL Server 日期时间值

    ...并保证日期匹配。

    如果您需要在数据库环境之间传递日期时间值,则需要以两者通用的格式传递它们,例如明确的字符串。 (如果我遇到这个问题,我会倾向于尝试 XML 使用的日期/时间格式。)

    编辑

    关于@roughnex 提供的非常丰富的答案,虽然从访问日期数字中减去 2 以获得 SQL Server 日期数字可能非常诱人(除非它是 ,这并不是一个好主意。有关原因的解释,请参阅以下博客条目

    Bug Psychology - Eric Lippert

    这样的捷径可能会导致看似奇怪的行为,这会极大地增加开发人员(以及用户)日后的负担。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多