如何获得两个日期之间的确切月份数?

时间:2015-06-16 20:07:00

标签: sql sql-server monthcalendar

DATEDIFF(MONTH, '1/1/2014', '12/31/2014') + 1

这会给我12个。

如果我这样做怎么办:

DATEDIFF(MONTH, '1/1/2014', '12/30/2014') + 1

它应该给我11分。如何获得这两个日期之间的确切月数?这需要适用于任何日期组合(任何一年的任何一个月)。

3 个答案:

答案 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)

带有MONTH选项的

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