我正在查看一些对SQL2005db运行查询的遗留VB6代码(years+years旧代码,在我之前)。它在WHERE子句中提供了一个日期限制--在这个子句中,由于在VB6中的日期上执行了CLng()操作,所以日期是一个整数值。
例如:
...
WHERE SomeDateField >= 4006440064是VB6通过对其执行CLng()将今天的日期转换为(9月8日)的日期。但是,在T-SQL中,这个整数实际上会转换为10个9月:
SELECT CAST(40064 AS DATETIME)因此,结果并不像预期的那样。
有人知道是什么导致VB和T-SQL之间的转换差异吗?
我确信这总是没有问题,显然我的建议是将日期作为标准ISO格式的日期进行传递。但是,需要尝试找到这种差异开始出现的原因。
发布于 2009-09-08 10:36:00
似乎VB的datetime开始于1899年12月30日:
?CDbl(#30/12/1899 03:00:01#)
0.125011574074074 而SQL datetime开始于1900年6月1日:
SELECT CAST(0 AS DATETIME)
1900-01-01 00:00:00.000这给出了两天的差异,这符合您的结果:)。
'VB6
CDbl(#2009-09-08#)
40064
-- SQL:
SELECT CAST(40064 AS DATETIME)
2009-09-10 00:00:00.000发布于 2009-09-08 10:15:48
在this线程中描述的Excel和SQL server之间也有类似的问题--我想这是同一件事?
发布于 2009-09-08 09:54:17
我认为这与1900年2月29日是否存在有关。我相信VB6认为有,但例如JavaScript不同意。然而,我不知道SQL Server是如何处理这个问题的;我相信它也不会计入feb。29.
https://stackoverflow.com/questions/1393050
复制相似问题