2015-10-07 54 views
1

有人可以帮我理解下面两个查询如何给出完全相同的结果吗?关于dateadd函数的第三个参数的T-sql混淆

SELECT DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, -1) 
SELECT DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, 0)- 1 

我明白写在下面的查询是如何工作的

SELECT DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, 0) 

我想我不能环绕我的头“-1”中的两个查询。

回答

2

两个语句都返回当前月份的最后一天,这是流程:

(!)
SELECT DATEDIFF(MM, 0, GETDATE()) /* Number of months from year 0=1900-01-01 (1389) */ 
SELECT DATEDIFF(MM, 0, GETDATE()) + 1 /* Adds 1 month to above int (1390) */ 
SELECT DATEADD(MM, 1390, 0) /* Adds 1390 back to year 0 (2015-11-01) */ 
-1 simply takes one day off this date and you get 2015-10-31 

主要是GETDATE()+ 1,其中它增加了1一天,但旧的日期和时间格式,这仅适用,如果你尝试这样它会失败:

SELECT CAST(0 As DateTime2) -1 

,而这个工程:

SELECT CAST(0 As DateTime) -1 

澄清:GETDATE()返回DateTime类型,这是确定使用+我,但如果你曾经尝试做一个+1到DATETIME2你会得到和错误。

1

让我们打破查询...

select DATEDIFF(MM, 0, GETDATE()) + 1 //it will give 1390 as OutPut 

现在把这个输出你的查询..

SELECT DATEADD(MM, 1390, -1) // it will give 2015-10-31 00:00:00.000 
SELECT DATEADD(MM, 1390, 0) // it will give 2015-11-01 00:00:00.000 

现在把所有瘦客户机在我们原来的查询

SELECT DATEADD(MM, 1390, -1) //it will give 2015-10-31 00:00:00.000 
SELECT DATEADD(MM, 1390, 0)- 1 //first dateadd function give this 2015-11-01 00:00:00.000 date then we subtract it by 1 day. hence it will give same op as above query.