Access 和 SQL Server 计算日期不同

Posted

技术标签:

【中文标题】Access 和 SQL Server 计算日期不同【英文标题】:Access and SQL Server calculate date differently 【发布时间】: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 中使用什么来修复它?

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于Access 和 SQL Server 计算日期不同的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server、Excel 和 MS Access 中的日期差异

将 Access 表日期值作为参数传递给 SQL Server 存储过程

用于 Access 的 SQL Server 迁移助手:日期数据类型

如何用SQL计算access2007数据表两个日期差?

使用 ODBC 连接时如何在 MS Access 或 SQL Server 中使用日期数据类型

您如何计算 Microsoft Access SQL 查询中的连续日期?