INTEGER到DATETIME的转换与VB6不同

Ada*_*Dev 3 sql t-sql sql-server vb6

我正在查看一些遗留的VB6代码(年代+岁,在我的时间之前),它运行针对SQL 2005 db的查询.它在WHERE子句中提供日期限制- 其中日期作为整数值给出,作为CLng()VB6中日期的结果.

例如

...
WHERE SomeDateField >= 40064
Run Code Online (Sandbox Code Playgroud)

40064就是VB6将今天的日期转换为(9月8日)的方法CLng().但是,在T-SQL中,这个整数实际上转换为9月10日:

SELECT CAST(40064 AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

结果不如预期.

任何人都知道什么可能导致VB和T-SQL之间的转换差异?

我确信这总是没有问题,显然我的建议是以标准ISO格式将日期作为日期传递.但是,需要尝试找到这种差异背后的原因.

Grz*_*lik 6

似乎VB日期时间从1899年12月30日开始:

?CDbl(#30/12/1899 03:00:01#)
 0.125011574074074 
Run Code Online (Sandbox Code Playgroud)

而SQL datetime从1900年6月1日开始:

SELECT CAST(0 AS DATETIME)
1900-01-01 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

这给你两天的差异,这符合你的结果:).

'VB6
CDbl(#2009-09-08#)
 40064 

-- SQL:
SELECT CAST(40064 AS DATETIME)
2009-09-10 00:00:00.000
Run Code Online (Sandbox Code Playgroud)