小编典典

Access和SQL Server计算日期的方式不同

sql

我们有一些通用工具,除其他外,可以保存和显示日期。它将另存为数字,例如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中使用什么来解决它?


阅读 288

收藏
2021-04-28

共1个答案

小编典典

因此,当我从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篇非常有趣的博客文章。

2021-04-28