繁体   English   中英

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

[英]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点东西。 如何获得这两个日期之间的确切月份数? 这需要适用于日期的任意组合(每年的任何月份)。

您可以通过以下方式自己进行计算:

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。
当然,您可以根据需要尽可能多地“内联”此代码,以避免所有中间声明。

想法是计算总月份差异,然后根据实际日期减去第一个月和最后一个月份的相对部分。

带有MONTH选项的DATEDIFF仅返回整数值。 使用天数或年数会给您带来粗略的“猜测”,但仍不完全正确(一个月/年中的天数不同,因此您不能仅将天数除以30)。

如果您希望准确无误,则需要编写自己的函数以从头到尾遍历几个月,并计算每个月有多少天,并获得该月涵盖的百分比/因数。

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 T-SQL的Jedi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM