当以不同的指定间隔使用DATEDIFF函数时,为什么会得到不同的结果?

时间:2019-07-18 03:38:30

标签: sql sql-server datediff

我正在使用使用YEAR和MONTH间隔的DATEDIFF函数运行以下查询,但是相应地修改了查询的右侧,以便我认为它们应该相同。 dbo.logs具有 2486512 行。

SELECT count(*) FROM dbo.logs                  
WHERE DATEDIFF(YEAR, DT, GetDate()) <= 1;

result: 595712

SELECT count(*) FROM dbo.logs                  
WHERE DATEDIFF(MONTH, DT, GetDate()) <= 12;

result: 334773

为什么我得到的结果截然不同?我认为指定12个月将返回与1年相同的行数。

2 个答案:

答案 0 :(得分:1)

DATEDIFF()并没有达到您的期望。它计算两个日期/时间之间的边界的数量。因此,以下两个年份的年差为“ 1”:

2018-12-31  and   2019-01-01
2018-01-01  and   2019-12-31

月份差异介于1到23之间。

更好的方法是使用日期算术:

WHERE DT <= DATEADD(YEAR, -1, GETDATE()) 

这不仅更准确,而且还可以利用索引。

答案 1 :(得分:0)

仅给出年份​​差异

SELECT  DATEDIFF(YEAR,'2017-02-02', GetDate())  
Result-2

它仅给出月差。

SELECT  DATEDIFF(MONTH,'2019-02-02', GetDate())

结果5