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

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中使用什么来修复它?

aru*_*lam 6

所以当我从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的两篇非常有趣的博客文章.

  • 在一个有趣的命运转折中,乔尔·斯波尔斯基和我对这种日期格式的怪癖有一些历史.请参阅http://blogs.msdn.com/b/ericlippert/archive/2003/09/16/53013.aspx和Joel非常有趣的文章http://www.joelonsoftware.com/items/2006/06/16.html (3认同)