我一直在使用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
。但我无法确定,因为我无法找到任何关于此号码在网上任何地方使用的日期。我是对的吗?
感谢您的时间。
答案 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,谨慎地保持相同的过程(否则它可能会破坏人们现有的代码)。