【问题标题】:Calculate period between two dates in months and days以月和日计算两个日期之间的时间段
【发布时间】:2020-05-15 00:48:27
【问题描述】:

我目前正在使用以下代码来确定两个日期之间的月份和天数:

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

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

谢谢

【问题讨论】:

  • 问朋友:“比 2020 年 1 月 1 日晚一个月是哪一天?”很有可能,他们会说 2020 年 2 月 1 日。如果您希望差值包括开始日期和结束日期,请加 1。
  • 为了说明 George 的观点,尝试将第二个日期设置为该月的最后一毫秒 :) ` DECLARE @date1 DATETIME = '2020-01-01 00:00:00' ` ` DECLARE @date2 DATETIME = dateadd(dd,0,'2020-01-31 23:59:59.999') ` ` 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' `
  • 您得到了正确的结果 - 奇怪的是您的期望 - 1 月 31 日和 1 月 1 日之间的差异不是一个月,而是 30 天 - 如果您测量 2 月 1 日和 1 月 1 日,那将是一个月第一。

标签: sql-server tsql datetime


【解决方案1】:

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

demo on dbfiddle.uk

看看下面的例子:

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

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

【讨论】:

  • 谢谢,这对我来说很有意义。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2019-06-07
相关资源
最近更新 更多