如何获得两个日期之间的确切月数?
how do I get the EXACT number of months between two dates?
DATEDIFF(MONTH, '1/1/2014', '12/31/2014') + 1
这将给我 12。
如果我这样做会怎样:
DATEDIFF(MONTH, '1/1/2014', '12/30/2014') + 1
它应该给我11分的东西。如何获得这两个日期之间的确切月数?这需要适用于任何日期组合(任何一年的任何月份)。
只有 MONTH 选项的 DATEDIFF returns 一个整数值。使用天数或年数会给你一个粗略的 "guesstimate" 但仍然不完全正确(month/year 中的天数不同所以你不能只将天数差除以 30)。
如果你想要精确,你需要编写自己的函数来遍历从开始到结束的月份,并计算每个月有多少天,并获得涵盖该月的 percentage/factor。
您可以通过以下方式自行计算:
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。
当然,您可以 "inline" 尽可能多地这样做,以避免所有中间声明。
想法是计算总月差异,然后根据实际日期减去第一个月和最后一个月的相对部分。
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
来自 T-SQL
的绝地克里斯
DATEDIFF(MONTH, '1/1/2014', '12/31/2014') + 1
这将给我 12。
如果我这样做会怎样:
DATEDIFF(MONTH, '1/1/2014', '12/30/2014') + 1
它应该给我11分的东西。如何获得这两个日期之间的确切月数?这需要适用于任何日期组合(任何一年的任何月份)。
只有 MONTH 选项的 DATEDIFF returns 一个整数值。使用天数或年数会给你一个粗略的 "guesstimate" 但仍然不完全正确(month/year 中的天数不同所以你不能只将天数差除以 30)。
如果你想要精确,你需要编写自己的函数来遍历从开始到结束的月份,并计算每个月有多少天,并获得涵盖该月的 percentage/factor。
您可以通过以下方式自行计算:
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。
当然,您可以 "inline" 尽可能多地这样做,以避免所有中间声明。
想法是计算总月差异,然后根据实际日期减去第一个月和最后一个月的相对部分。
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
来自 T-SQL
的绝地克里斯