DATEDIFF(MONTH, '1/1/2014', '12/31/2014') + 1
这会给我12个。
如果我这样做怎么办:
DATEDIFF(MONTH, '1/1/2014', '12/30/2014') + 1
它应该给我11分。如何获得这两个日期之间的确切月数?这需要适用于任何日期组合(任何一年的任何一个月)。
答案 0 :(得分:3)
您可以通过以下方式自行进行计算:
DECLARE @startdate date = '1/1/2014'
DECLARE @enddate date = '12/30/2014'
DECLARE @startday int = DATEPART(DAY, @startdate)
DECLARE @endday int = DATEPART(DAY, @enddate)
DECLARE @startdateBase date = DATEADD(DAY, 1 - @startday, @startdate)
DECLARE @enddateBase date = DATEADD(DAY, 1 - @endday, @enddate)
DECLARE @deciMonthDiff float = CAST(DATEDIFF(MONTH, @startdate, @enddate) AS float) -
(@startday - 1.0) / DATEDIFF(DAY, @startdateBase, DATEADD(MONTH, 1, @startdateBase)) +
(@endday - 1.0) / DATEDIFF(DAY, @enddateBase, DATEADD(MONTH, 1, @enddateBase))
SELECT @deciMonthDiff
这会将@deciMonthDiff
计算为11.935483870967
当然你可以"内联"这就是你想要的,以避免所有的中间声明。
这个想法是计算总月差,然后减去第一个&的相对部分。上个月取决于实际的一天。
答案 1 :(得分:2)
DATEDIFF仅返回一个整数值。使用数天或数年会给你一个粗略的猜测"但仍然不完全正确(每月/每年的天数不同,因此您只能将天差除以30)。
如果你想要确切的话,你需要编写自己的函数来完成从开始到结束的几个月,并计算每个月的天数,并获得该月份的百分比/因子。
答案 2 :(得分:0)
DECLARE @startdate date = '1/1/2014'
DECLARE @enddate date = '12/30/2014'
select case when DATEPART(DAY, @startdate) <= DATEPART(DAY, @enddate)
then datediff(month, @startdate, @enddate)
else datediff(month, @startdate, @enddate) -1
end
来自Chris The Jedi of T-SQL