我在使用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个月日期差异的正确结果? 有人能帮助我吗?
由于
答案 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-01
和2014-11-30
,其(2014-2013) * 12 + (11 - 12)
确实是11.对于'2013-12-31'
和'2014-11-01'
,它也是11.再次,它是这样做的,因为它是唯一的文化中立和完全一致的方式这样做。
您需要定义"更正"是根据您的应用程序,然后编写您的查询。如果需要重复使用逻辑,建议使用用户定义的函数。