如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值

Posted

技术标签:

【中文标题】如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值【英文标题】:How to calculate the number of months and days between two dates, without returning negative values in SQL Server 【发布时间】:2019-06-08 01:06:32 【问题描述】:

我在大多数情况下都可以使用此 SQL 块,但是当结束日期的月/日大于开始日期的月/日时,我会返回负的“日”值。不太确定如何防止负日结果的发生,除了在结束月/日>开始月/日时捕获异常的情况下将其包装起来。

例如,如果开始日期为 2017 - 06 -05,结束日期为 2019 - 06 - 04,则输出为“24 个月零 -1 天”。

CONVERT ( VARCHAR ( MAX ),
DATEDIFF ( month , [Participant - Birthday] , [Event - Event Date] ) ) 

+ ' months and ' + 

CONVERT ( VARCHAR ( MAX ) , 
DATEDIFF ( day , DATEADD ( month , DATEDIFF ( month , [Participant - Birthday] , [Event - Event Date] ) , [Participant - Birthday] ) , [Event - Event Date] ) ) 

+ ' days'

使用上述开始和结束日期的预期输出应为“23 个月零 30 天”。

【问题讨论】:

【参考方案1】:

这是表达逻辑的另一种方式:

select s, e, v.num_months, datediff(day, dateadd(month, num_months, s), e)
from (values (convert(date, '2017-06-05'), convert(date, '2019-06-04')),
             (convert(date, '2017-06-05'), convert(date, '2019-06-05')),
             (convert(date, '2017-06-05'), convert(date, '2019-06-06'))
     ) t(s, e) cross apply
     (values (case when day(s) <= day(e) then datediff(month, s, e) else datediff(month, s, e) - 1 end)) v(num_months);

这会计算到结束日期或之前的月差数。然后它计算结束日期和开始日期之间的天差加上月数。

【讨论】:

以上是关于如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值的主要内容,如果未能解决你的问题,请参考以下文章

如何用PHP+MySQL计算两个日期之间的月份数和其余下的天数?

SQL是计算两个日期相差多少天数的函数?

c#如何计算两个日期之间相隔天数

计算SQL中两个日期之间的月数[重复]

如何在VB中计算两个日期间的天数

vfp中要计算两个日期间相差天数如何编写程序?