Разница в дате SQL в днях Результат неверен - PullRequest
0 голосов
/ 31 мая 2018

Я хочу рассчитать разницу в днях между двумя датами.

Когда я вычисляю разницу между '2017-01-01' и '2018-01-15', это ее 379 дней.

SELECT DATEDIFF(DD,'2017-01-01','2018-01-15') 

Но когда я разбил даты на две части с добавлением. Затем я получил результат 378.

select DATEDIFF( DD,'2017-01-01', '2017-12-31') + DATEDIFF( DD,'2018-01-01', '2018-01-15') 

кто-нибудь объяснит мне, почему это произошло?

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Это из-за дополнительного дня, который не рассчитывается во втором случае.Чтобы объяснить, почему это происходит в вашем первом запросе

SELECT DATEDIFF(DD,'2017-01-01','2018-01-15')

, вы делаете что-то похожее на: 1 - 380 = 379.

В то время как во втором

это (1-365) + (1-15) = 364 + 14 = 378.

В зависимости от того, что вы после

, возможно, было бы лучше разбить его на:

select DATEDIFF( DD,'2017-01-01', '2018-01-01') + DATEDIFF( DD,'2018-01-01', '2018-01-15')
0 голосов
/ 31 мая 2018

Это очень простая математика:

I:  <a,b>
II: <a,c>,<c+1,b>   where c is between a and b

I      II
b-a != b-(c+1) + c-a
b-a != b-c-1 + c-a
b-a != b-a-1       -- here is 1 missing day

Чтобы сделать это правильно, вы можете использовать:

select DATEDIFF( DD,'2017-01-01', '2018-01-01') 
     + DATEDIFF( DD,'2018-01-01', '2018-01-15') 
0 голосов
/ 31 мая 2018

Правильный способ разбить на два раздела - повторить дату:

select (DATEDIFF(DAY, '2017-01-01', '2017-12-31') +
        DATEDIFF(DAY, '2017-12-31', '2018-01-15') 
       )

Ваша версия пропускает день, поэтому не удивительно, что она выключена на день.

0 голосов
/ 31 мая 2018

Datediff считает границы типа даты между двумя датами.

Граница «конец« 2017-12-31 »- начало« 2018-01-01 »» включена впервый случай, но не второй.

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