计数月份与SQL SERVER的日期不同

时间:2014-12-24 04:16:00

标签: sql sql-server datediff

我在使用sql server query

计算2个月的差异时遇到问题

我尝试使用DATEDIFF(MONTH, SD, ED)

这个例如

SD = '2013-12-10 00:00:00.000'
ED = '2014-12-09 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 12 //this correct result


SD = '2013-12-10 00:00:00.000'
ED = '2014-12-10 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 12 //this incorrect result, the result that i want is 13


SD = '2013-12-10 00:00:00.000'
ED = '2014-12-15 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 12 //this incorrect result, the result that i want is 13

SD = '2013-12-01 00:00:00.000'
ED = '2014-11-30 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 11//this incorrect result, the result that i want is 12

是否有任何解决方案可以获得2个月日期差异的正确结果? 有人能帮助我吗?

由于

2 个答案:

答案 0 :(得分:5)

DATEDIFF仅比较几个月内的日期。由于您希望包含部分月份,请尝试比较日期,并添加CASE WHEN DATEPART(day,@d2) >= DATEPART(day,@d1) THEN 1 ELSE 0 END

所以要使用你问题中的符号:

SELECT DATEDIFF(MONTH, SD, ED) +
    CASE WHEN DATEPART(DAY, ED) >= DATEPART(DAY, SD) THEN 1 ELSE 0 END

答案 1 :(得分:2)

DATEDIFF()的工作方式与许多人的预期不同。来自official documentation

  

返回指定的 startdate enddate 之间交叉的指定 datepart 边界的计数(有符号整数)。

DATEDIFF(MONTH, @startdate, @enddate)相当于

(YEAR(@enddate) - YEAR(@startdate)) * 12 + (MONTH(@enddate) - MONTH(@startdate)). 

因此,对于2013-12-012014-11-30,其(2014-2013) * 12 + (11 - 12)

确实是11.对于'2013-12-31''2014-11-01',它也是11.再次,它是这样做的,因为它是唯一的文化中立和完全一致的方式这样做。

您需要定义"更正"是根据您的应用程序,然后编写您的查询。如果需要重复使用逻辑,建议使用用户定义的函数。