Cam*_*llo 3 sql t-sql sql-server ms-access date
我们有一些通用工具,其中包括可以保存和显示日期.它会将其保存为数字,例如41247.
如果我将其转换回Access中的日期,我会得到2012/12/04 - 这是正确的.
[使用格式(41247;"一般日期")或格式(格式("41247","短日期"),"短日期")]
如果我将该数字转换回SQL Server中的日期我得到2012/12/06 - 不正确.我正在使用CONVERT(datetime,CONVERT(real,41247))
为什么差异,我可以在SQL中使用什么来修复它?
所以当我从excel文件导入数据时遇到了这个问题.
有两个原因,你有2天的差异
原因1在SQL Server中,1900年1月1日是第0天,而在访问时则是第1天.
(我没有使用Access,但如果您在Excel中输入日期1900-01-01并将单元格格式化为数字,则会得到1).
原因2 1900年不是闰年.SQL Server知道它,但Access不知道.它认为1900年2月29日存在.
在SQL Server中运行它
SELECT DATEDIFF(dd, 0, '1900-01-01')
SELECT DATEDIFF(dd, 0, '1900-02-28')
SELECT DATEDIFF(dd, 0, '1900-03-01')
Run Code Online (Sandbox Code Playgroud)
输出将是
0
58
59
Run Code Online (Sandbox Code Playgroud)
但是当你试图跑步时
SELECT DATEDIFF(dd, 0, '1900-02-29')
Run Code Online (Sandbox Code Playgroud)
你会收到一个错误
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Run Code Online (Sandbox Code Playgroud)
由于这两个原因,您可以在Access中获得2天以上的时间.
所以对于2012/12/04 Access返回41247,而SQL Server将给你41245.
希望它有所帮助.
编辑
看看Eric Lippert的评论,他提到了他和Joel Spolsky的两篇非常有趣的博客文章.