使用sql-server计算X-mas日

时间:2014-12-26 07:01:34

标签: sql-server

我正在使用sql-server 2012

我得到了这个查询来计算x-mas日,但无法得到逻辑:

select dateadd(yy,datediff(yy,-1,getdate()),-7)

datediff(yy,-1,getdate())给出115

但这对我来说是如何工作的december 25

请解释..

3 个答案:

答案 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,因此-71899-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