首页 > 解决方案 > 以月和日计算两个日期之间的时间段

问题描述

我目前正在使用以下代码来确定两个日期之间的时间段(以月和日为单位):

DECLARE @date1 DATETIME = '2009-01-01 00:00:00'
DECLARE @date2 DATETIME = '2010-06-30 00:00:00'

SELECT CAST(DATEDIFF(mm, @date1, @date2) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, @date2), @date1), @date2) AS VARCHAR(2)) + ' Days'

这个问题是代码似乎没有计算最后一天,所以上面返回 17 个月 29 天,而我需要的返回是 18 个月。

同样如下:

DECLARE @date1 DATETIME = '2020-01-01 00:00:00'
DECLARE @date2 DATETIME = '2020-01-31 00:00:00'

SELECT CAST(DATEDIFF(mm, @date1, @date2) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, @date2), @date1), @date2) AS VARCHAR(2)) + ' Days'

返回 0 个月 30 天而不是 1 个月。

有没有办法修改上述内容以识别天数等于一个月的整个月份并计算最后一天?

谢谢

标签: sql-servertsqldatetime

解决方案


您必须将一天(使用DATEADD)添加到第二个日期(@date2):

-- first example
DECLARE @date1 DATETIME = '2009-01-01 00:00:00'
DECLARE @date2 DATETIME = '2010-06-30 00:00:00'

SELECT CAST(DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)), @date1), DATEADD(DAY, 1, @date2)) AS VARCHAR(2)) + ' Days'

-- second example
DECLARE @date1 DATETIME = '2020-01-01 00:00:00'
DECLARE @date2 DATETIME = '2020-01-31 00:00:00'

SELECT CAST(DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)), @date1), DATEADD(DAY, 1, @date2)) AS VARCHAR(2)) + ' Days'

dbfiddle.uk 上的演示

请看以下示例:

  • DATEDIFF和为 0。 (2020-01-01和之间最大差异等于 0 天、23 小时、59 分钟和 59 秒。2020-01-01
    2020-01-01 00:00:002020-01-01 23:59:59
  • DATEDIFF和是 1。 (2020-01-01和之间最大差异等于 1 天 23 小时 59 分 59 秒。2020-01-02
    2020-01-01 00:00:002020-01-02 23:59:59

因此,由于这一天还没有结束,因此您不能将最后一天算作差异中的一天。


推荐阅读