以月和日为单位计算两个日期之间的周期



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

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 天而不是一个月。

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

谢谢

您必须将一天(使用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 演示

请看以下示例:

  • 2020-01-012020-01-01DATEDIFF为 0。
    (2020-01-01 00:00:002020-01-01 23:59:59之间的最大差值等于 0 天 23 小时 59 分 59 秒。
  • 2020-01-012020-01-02DATEDIFF为 1。
    (2020-01-01 00:00:002020-01-02 23:59:59之间的最大差值等于 1 天 23 小时 59 分 59 秒。

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

最新更新