![](/img/trans.png)
[英]How to calculate the number of months and days between two dates, without returning negative values in SQL Server
[英]Calculate period between two dates in months and days
我目前正在使用以下代码来确定以月和日为单位的两个日期之间的时间段:
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 个月。
有没有办法修改上述内容以识别天数等于一个月的整月并计算最后一天?
谢谢
您必须将一天(使用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'
看看下面的例子:
2020-01-01
和2020-01-01
DATEDIFF
为 0。2020-01-01 00:00:00
和2020-01-01 23:59:59
之间的最大差异等于 0 天 23 小时 59 分 59 秒。2020-01-01
和2020-01-02
DATEDIFF
为 1。2020-01-01 00:00:00
和2020-01-02 23:59:59
之间的最大差异等于 1 天 23 小时 59 分 59 秒。所以你不能把最后一天算作差异的一天,因为这一天还没有结束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.