【发布时间】: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