访问 ODBC 返回 1753 年之前的错误日期

Posted

技术标签:

【中文标题】访问 ODBC 返回 1753 年之前的错误日期【英文标题】:Access ODBC returning incorrect dates prior to the year 1753 【发布时间】:2016-06-11 22:34:49 【问题描述】:

我在使用 R ODBC 连接 Access 2016 数据库时遇到了一个奇怪的问题。

参考 Access 数据库中的日期,R 中的日期相差 -28 天。

例如,在访问:1639-01-24;在 R:1638-12-27。 R中日期的格式为“1638-12-27 LMT”。

为了解决这个问题,我必须使用Format 函数将日期变量作为字符串获取:

Select format([date],'yyyy-mm-dd') ...

有人可以解释为什么会这样吗?

【问题讨论】:

这和公历有关系吗?差异太大。最近的日期(即 20 世纪)会发生什么 我认为你是对的!我检查了一个更新的日期,它是正确的。 但是对于 17 世纪和 18 世纪有错误但有变化:从 1686 年起 16 天; 1732 的 6 天。很奇怪。 一定是别的东西。公历是在 1582 年引入的,与儒略历的变化“只有”10 天。然而,许多国家采用日历的时间要晚得多,有些是不到 100 年前。不过,这不能解释 28 天。另外,请注意,Access (VBA) 日历实现是一个“伪”公历 日历,因为它很高兴地从 1582-10-15 的介绍退回到 100-01-01。因此,DateAdd("m", -1, #1582/10/15#) 返回 1582-09-15 【参考方案1】:

尽管 Access 中的 Date/Time 字段类型被定义为“100 年到 9999 年之间的日期或时间值”(ref),但 Access ODBC 驱动程序在处理 1 月 1 日之前的日期时似乎存在问题, 1753. 我能够确认在 RODBC 和 .NET System.Data.Odbc 下使用 Microsoft Access Driver (*.mdb, *.accdb)

Access 中的1753-01-01 由Access ODBC 返回为1753-01-01(正确),但Access 中的1752-12-31 由Access ODBC 返回为1752-12-30(错误)

而且,正如您所发现的,随着时间的推移,差异会越来越大。

还有一篇 Microsoft 知识库文章 here 与尝试插入 1753 年之前的日期时 Access ODBC 的问题相关。

1753-01-01 可能是 SQL Server 中 DATETIME 列类型的最早可能日期,这可能不是巧合。有关该日期重要性的更多详细信息,请参阅

What is the significance of 1/1/1753 in SQL Server?

Access 中只有一个 Date/Time 类型,因此我们无法将值转换为 SQL Server 中的 DATETIME2 之类的值。因此,最好的解决方法可能是使用Format() 将日期值转换为问题中提到的文本。

还值得注意的是,Access OLEDB 提供程序 (Microsoft.ACE.OLEDB.12.0) 在 1753 年之前的日期不会出现同样的问题。

【讨论】:

以上是关于访问 ODBC 返回 1753 年之前的错误日期的主要内容,如果未能解决你的问题,请参考以下文章

ODBC错误处理

数据库datetime是啥类型

验证日期是不是在 SqlDbType.DateTime 范围内

ODBC 调用失败 - 从 32 位 ODBC 5.1 移动到 64 位 5.3 后出现随机日期溢出错误

课堂练习之小强大扫荡

PL/SQL 脚本验证