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

Access ODBC returning incorrect dates prior to the year 1753

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

R 中的日期与 Access 数据库中的日期相差 -28 天。

例如Access中:1639-01-24;在 R 中:1638-12-27。 R中日期的格式是“1638-12-27 LMT”。

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

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

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

尽管 Access 中的 Date/Time 字段类型被定义为 "date or time value between the years 100 and 9999" (ref),但 Access ODBC 驱动程序在处理 1753 年 1 月 1 日之前的日期时似乎存在问题. 我能够确认在 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 服务器中 DATETIME 列类型的最早日期可能不是巧合。有关该日期意义的更多详细信息,请参阅

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

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

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