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

Posted

技术标签:

【中文标题】如何获得两个日期之间的确切月数?【英文标题】:how do I get the EXACT number of months between two dates? 【发布时间】:2015-06-16 20:06:59 【问题描述】:
DATEDIFF(MONTH, '1/1/2014', '12/31/2014') + 1

这会给我 12 个。

如果我这样做会怎样:

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

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

【问题讨论】:

确切地说,您是指整月吗? 2014 年 1 月 31 日 -> 2014 年 1 月 2 日之间有几个月?和 2014 年 1 月 1 日 -> 2014 年 2 月 28 日? 满或不满取决于输入参数。考虑到数字可能是小数,我需要两个日期之间的确切月数。在我的示例中,差异是 11 POINT 几个月,而不是 12 个整月。 您将结果加一 (11) 11+1 = 12。SELECT DATEDIFF(MONTH, '1/1/2014', '12/31/2014')SELECT DATEDIFF(MONTH, '1/1/2014', '12/30/2014') 都返回 11 DATEDIFF 用于返回跨越的日期边界数。这是在手册中。此外,“月”是一个任意概念,适用于间隔中的特定天数。例如,整个二月和整个三月通常只有 59 天,但整个七月和八月都是 62 天。 【参考方案1】:

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

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。 当然,您可以根据需要“内联”它,以避免所有中间声明。

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

【讨论】:

这就是我要找的。谢谢。【参考方案2】:

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

如果您想要准确,您需要编写自己的函数来遍历从开始到结束的月份,并计算每个月有多少天,并获得该月的百分比/因子。

【讨论】:

你不必“整个月都走”,你只需要纠正第一个和最后一个,这并不可怕 我想是真的。知道您“消费”了一个月的百分比是完全一样的逻辑,所以我不确定所需的工作会有多大差异。【参考方案3】:
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 的绝地

【讨论】:

如果 startdate 是 20200202 而 enddate 是 20200201,这给 -1 甚至只有一天不同!

以上是关于如何获得两个日期之间的确切月数?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算定义自定义财务日历的两个日期之间的月数?

如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值

如何在java中将月份转换为确切的天数

Pandas - 两个日期之间的月数

c#如何计算两个日期之间相隔天数

两个日期之间的月数