关于dateadd函数的第三个参数的T-Sql混淆

时间:2015-10-07 05:22:36

标签: sql sql-server

有人可以帮助我理解以下两个查询如何给出完全相同的结果吗?

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 个答案:

答案 0 :(得分: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

Key是GetDate()+ 1,它增加了1天(!),但这仅适用于旧的日期和时间格式,如果您尝试这样做会失败:

SELECT CAST(0 As DateTime2) -1 

虽然这有效:

SELECT CAST(0 As DateTime) -1

澄清一下:GetDate()返回DateTime类型,这可以使用+ i,但是如果你尝试对DateTime2做+1,你就会得到错误。

答案 1 :(得分: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.