Sql server 使用sql server计算X-mas日

Sql server 使用sql server计算X-mas日,sql-server,Sql Server,我正在使用sql server 2012 我得到这个查询来计算x-mas日,但无法得到逻辑: 选择dateadd(yy,datediff(yy,-1,getdate()),-7) datediff(yy,-1,getdate())给出115 但是,这是如何让我在12月25日到达的呢 请解释..DATEDIFF接受三个参数,第一个参数将定义您要查找的差异,第二个和第三个参数是startdate和enddate 在你的例子中,你给了-1作为起始日期,这只是 select cast(-1 as dat

我正在使用sql server 2012

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

选择dateadd(yy,datediff(yy,-1,getdate()),-7)

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

但是,这是如何让我在12月25日到达的呢


请解释..

DATEDIFF接受三个参数,第一个参数将定义您要查找的差异,第二个和第三个参数是startdate和enddate

在你的例子中,你给了-1作为起始日期,这只是

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函数,它再次接受三个参数,其中第二个参数是number,第三个参数是date

您给出了-7,这相当于
选择cast(-7作为日期时间)--1899-12-25 00:00:00.000
注:自sqlserver开始日期(1900-01-01 00:00:00.000)起7天=>1899-12-25 00:00:00.000

其中年份部分为1899年,我们在此基础上增加115
因此
选择1899+115
=2014,其收益率如下


选择dateadd(yy,115,'1899-12-25 00:00:00.000')--2014-12-25 00:00:00.000这里的键是
dateadd函数中的
-7
,该函数提供带有
'25 dec'的日期

在Sql Server中,日期时间数据类型的第一个日期是
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函数
),因此从那里您将添加一些
x
年(115),这将为您提供一个日期为
2014-12-25 00:00:00.000
,在sql server中,开始日期始终取为
1900

因此在
datediff函数中

select datediff(yy,-1,getdate()) = 115 --> 1900-1 = 1899 till 2014 = 115
日期添加函数中的

select dateadd(yy,115,-7)= Jan 2015 -7 days  = 25-12-2014