VBA CDate与SQL Server 2005中的Convert(datetime,)不匹配

Jef*_*ffO 3 sql-server ms-access vba

在Access 2003 VBA(使用立即窗口)中

? CDate(39870) 
Run Code Online (Sandbox Code Playgroud)

返回:2009年2月26日

在SQL Server 2005(SQL Server Management Studio)中

SELECT CONVERT(DATETIME, 39870)
Run Code Online (Sandbox Code Playgroud)

返回:2009-02-28 00:00:00.000

它们总是相差2还是还有其他日期设置我不见了?

服务器排序规则= SQL_Latin1_General_CP1_CI_AS

Bra*_*adC 6

不同的语言和系统使用不同的日期数字表示.

SQL 2005计算从19/1年1月1日起的天数:

SELECT CONVERT(DATETIME, 1)
1900-01-02 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

Excel和Access VBA计算从18/30/1899开始的天数:

? CDate(1) 
12/31/1899 
Run Code Online (Sandbox Code Playgroud)

其他人从其他看似随机的起点开始计算天数,秒数或有时毫秒数.我认为MS DOS使用1990年12月31日.UNIX使用1/1/1970.

所以不要试图直接翻译它们(数字,即).您必须转换为实际日期表示(01-03-2009),然后再转换回其他环境.

编辑:VBA有一些关于向后兼容性和闰年计算的有趣怪癖.看到乔尔与比尔盖茨的第一次相遇就读得很好.