我们有一些通用工具,除其他外,可以保存和显示日期。它将另存为数字,例如41247。
如果我将其转换回Access中的日期,则会得到2012/12/04-是正确的。 [使用Format(41247;“常规日期”)或Format(Format(“ 41247”,“ Short Date”),“ Short Date”)]
如果我将该数字转换回SQL Server中的日期,则会得到2012/12/06-不正确。我正在使用CONVERT(datetime,CONVERT(real,41247))
为什么会有区别,我可以在SQL中使用什么来解决它?
因此,当我从excel文件导入数据时遇到了这个问题。
您有2天的差异有两个原因
原因1在您的SQL Server中,1900年1月1日是Day 0,而在访问中是Day 1。
(我没有使用Access,但是如果您在Excel中输入日期1900-01-01并将单元格格式设置为数字,则会得到1)。
原因2 1900年不是a年。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')
输出将是
0 58 59
但是当你尝试跑步时
SELECT DATEDIFF(dd, 0, '1900-02-29')
你会得到一个错误
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
由于上述两个原因,您的访问时间将增加2天。
因此,对于2012/12/04,Access返回41247,而SQL Server将给您41245。
希望能有所帮助。
编辑
看看Eric Lippert的评论,他提到了他和Joel Spolsky撰写的2篇非常有趣的博客文章。