Рассчитать период между двумя датами в месяцах и днях - PullRequest
0 голосов
/ 29 января 2020

В настоящее время я использую следующий код для определения периода между двумя датами в месяцах и днях:

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 Ответ

2 голосов
/ 29 января 2020

Вы должны добавить один день (используя 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'

демо на dbfiddle.uk

Посмотрите на следующие примеры:

  • DATEDIFF из 2020-01-01 и 2020-01-01 равно 0.
    (макс. Разница между 2020-01-01 00:00:00 и 2020-01-01 23:59:59 равно 0 дням, 23 часам, 59 минутам и 59 секундам.
  • DATEDIFF из 2020-01-01 и 2020-01-02 равно 1.
    (Максимальная разница между 2020-01-01 00:00:00 и 2020-01-02 23:59:59 равна 1 дню, 23 часам, 59 минутам и 59 секундам.

Таким образом, вы не можете считать последний день днем в разнице, так как день не закончился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...