我正在使用sql-server 2012
我得到了这个查询来计算x-mas日,但无法得到逻辑:
select dateadd(yy,datediff(yy,-1,getdate()),-7)
datediff(yy,-1,getdate())给出115
但这对我来说是如何工作的december 25
?
请解释..
答案 0 :(得分:2)
在sql server中,开始日期始终为1900
。
所以datediff function
:
select datediff(yy,-1,getdate()) = 115 --> 1900-1 = 1899 till 2014 = 115
In dateadd function
:
select dateadd(yy,115,-7)= Jan 2015 -7 days = 25-12-2014
答案 1 :(得分:1)
此处的关键是-7
dateadd function
,其中为'25 dec'
在Sql Server中,datetime数据类型的第一个日期为1900-01-01 00:00:00.000
,因此-7
为1899-12-25 00:00:00.000
从那里开始添加一些x
年(115),这样您就可以获得2014-12-25 00:00:00.000
的日期
示例强>
CREATE TABLE #temmp(dates DATETIME)
INSERT INTO #temmp
VALUES (0),(1),(2),(3),(-7)
Select * from #temmp
<强>结果:强>
dates
1900-01-01 00:00:00.000
1900-01-02 00:00:00.000
1900-01-03 00:00:00.000
1900-01-04 00:00:00.000
1899-12-25 00:00:00.000
上一行日期为1899-12-25 00:00:00.000
(在您的DateAdd function
中使用),因此您可以在此处添加一些x
年(115),这将给您一个约会{ {1}}
答案 2 :(得分:0)
DATEDIFF接受三个参数,第一个参数将定义你要找到的差异,第二个和第三个参数是startdate和enddate。
在你的情况下,你给了-1作为startdate,这只是
select cast(-1 as datetime) --1899-12-31 00:00:00.000
select getdate() --2014-12-25 23:22:36.493
select (2014-1899) --115
是你的年份差异。
最重要的是,还有一个dateadd功能再次接受三个参数,其中第二个参数是数字,第三个参数是日期。
你给了-7,相当于select cast(-7 as datetime) --1899-12-25 00:00:00.000
注意:从sqlserver开始的-7天STARTDATE(1900-01-01 00:00:00.000)=&gt; 1899-12-25 00:00:00.000
其中年份部分给你1899我们要添加的115
所以select 1899 + 115
= 2014,产生如下
选择dateadd(yy,115,&#39; 1899-12-25 00:00:00.000&#39;) - 2014-12-25 00:00:00.000