我在大多数情况下都可以使用此SQL块,但是当结束日期的月/日大于开始日期的月/日时,我将返回负的“ day”值。除了在结束月/日大于开始月/日时捕获异常的情况下包装这种情况以外,还不太确定如何防止发生负面的日结果。
例如,如果开始日期为2017年06月-05日,结束日期为2019年6月4日,则输出为“ 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天”。
答案 0 :(得分: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);
这将计算结束日期之前或之前的月份差数。然后,它计算出结束日期和开始日期之间的日差加上该月数。