SQL Server - 用作日期的整数

时间:2017-12-12 12:21:06

标签: sql-server

我一直在使用SQL一段时间 - 不得不使用Oracle和SQL Server来完成我的工作 - 但是,我刚刚遇到过一些我以前没见过的东西。

在看到这个并进行一些研究之后,据说在SQL服务器中,数字0可以用作基准日期,即:

  

1900-01-01

所以例如: select DATEDIFF(yy, 0, '2017-12-31')会返回117,因为1900-01-01会替换0

我的第一个问题是,为什么这样,考虑到这不是SQL中的最小日期值(我认为是1753年)?

我的第二个问题是,我遇到了另一条使用数字-1代替0的SQL。

经过一些测试,我可以认为它指的是1899-12-31。但我无法确定,因为我无法找到任何关于此号码在网上任何地方使用的日期。我是对的吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

首先,没有理由使用0作为日期。主要原因(最初)是截断时间组件:

select dateadd(day, datediff(day, 0, <datetime>), 0)

请注意,这适用于任何日期值,但往往会使用0

现在使用select cast(<datetime> as date)完成此操作。

但要回答你的问题。 SQL Server确实支持负数作为日期。使用“-1”的原因是为了与Excel兼容。在Excel中,“0”日期是“1900-01-00”,实际上是“1899-12-31”。

我不确定为什么Microsoft软件的日期有两个不同的零值。 (好吧,我确实......微软历史上购买了软件而不是自己编写软件。)这有点令人困惑,但这可能就是为什么使用“-1”。

答案 1 :(得分:2)

正确,在SQL Server中,日期0代表1900年1月1日。

0 = 19000101
1 = 19000102
2 = 19000103
...
43080 = 20171212

因此,不出所料,零以下的数字的工作方式相同:

-1 = 18991231
-2 = 18991230
...
-53690 = 17530101

至于为什么0是1900,这可能追溯到SQL Server之前,当它被称为SyBase时。最有可能的是,当时0代表19000101,并且随着SyBase成为SQL Server,谨慎地保持相同的过程(否则它可能会破坏人们现有的代码)。