Как рассчитать количество месяцев и дней между двумя датами, не возвращая отрицательные значения в SQL Server - PullRequest
0 голосов
/ 08 июня 2019

У меня этот блок 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 Ответ

1 голос
/ 08 июня 2019

Вот альтернативный способ выражения логики:

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);

Это вычисляет разницу в количестве месяцев - до или до конечной даты.Затем он вычисляет разницу в днях между датой окончания и датой начала плюс это количество месяцев.

...