SQL DateDiff в минутах, охватывающих в течение ночи - PullRequest
0 голосов
/ 06 декабря 2018

Попытка получить разницу в минутах между полем даты и времени.Я использую функцию Datediff.

Когда время начала начинается в одну дату, например «2018-01-08 22: 35: 55.043», а время окончания - следующий день, например «00: 35: 56.2136644», результат отсчитывается отВремя окончания до времени начала.

Примеры:

select DATEDIFF(MINUTE, CAST('2018-01-08 22:35:55.043' AS TIME), '00:35:56.2136644') AS minDiff1
select DATEDIFF(MINUTE,  '00:35:56.2136644', CAST('2018-01-08 22:35:55.043' AS TIME)) AS minDiff2
select DATEDIFF(MINUTE, CONVERT(TIME, '2018-01-08 22:35:55.043'), '00:35:56.2136644') AS minDiff3
select DATEDIFF(MINUTE, '00:35:56.2136644', CONVERT(TIME, '2018-01-08 22:35:55.043')) AS minDiff4

Результаты отличались от ожидаемых.Желаемый результат будет 120 минут.

minDiff1 = -1320

minDiff2 = 1320

minDiff3 = -1320

minDiff4 = 1320

Оригинальный запрос

select DATEDIFF(MINUTE, CAST(test_start_datetime as TIME), test_end_time) AS minDiff
from user_exam  

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Предполагается, что время относится к тому же или самому следующему дню:

SELECT *, CASE
    -- same day -- start time is less than end time
    WHEN CAST(datetimecol AS time) <= timecol THEN DATEDIFF(MINUTE, CAST(datetimecol AS time), timecol)
    -- next day -- start time is more than end time (it rolled over into next day)
    ELSE 1440 - DATEDIFF(MINUTE, timecol, CAST(datetimecol AS time))
END
FROM (VALUES
    (CAST('2018-01-08 22:35:55.043' AS DATETIME), CAST('22:35:55.0433333' AS TIME)),
    (CAST('2018-01-08 22:35:55.043' AS DATETIME), CAST('23:35:56.2136644' AS TIME)),
    (CAST('2018-01-08 22:35:55.043' AS DATETIME), CAST('00:35:56.2136644' AS TIME))
) AS tests(datetimecol, timecol)

В приведенном выше примере 1440 - это количество минут в 24 часах.

Демонстрация на DB Fiddle

0 голосов
/ 06 декабря 2018

Если вы хотите увидеть 120, это значит, что разницы во времени недостаточно для вашей цели.С помощью вашего вопроса вы хотите найти разницу между 22:35 и следующим днем ​​00:35 Вам нужно найти разницу в DATETIME примерно так:

SELECT DATEDIFF(MINUTE,         CAST(GETDATE() AS DATETIME)
                               +CAST(CAST('22:35:55.2136644' AS TIME) AS DATETIME)
                             , 
                                CAST(GETDATE() AS DATETIME)+1
                               +CAST(CAST('00:35:56.2136644' AS TIME)AS DATETIME)

                ) AS minDiff1
0 голосов
/ 06 декабря 2018

Давайте сначала пересмотрим ваши примеры:

select DATEDIFF(MINUTE, CAST('2018-01-08 22:35:55.043' AS TIME), '00:35:56.2136644') AS minDiff1
select DATEDIFF(MINUTE,  '00:35:56.2136644', CAST('2018-01-08 22:35:55.043' AS TIME)) AS minDiff2
select DATEDIFF(MINUTE, CONVERT(TIME, '2018-01-08 22:35:55.043'), '00:35:56.2136644') AS minDiff3
select DATEDIFF(MINUTE, '00:35:56.2136644', CONVERT(TIME, '2018-01-08 22:35:55.043')) AS minDiff4

Преобразование / приведение из даты во время отбрасывает часть даты.Таким образом, вы на самом деле выполняете:

select DATEDIFF(MINUTE, '22:35:55.043'', '00:35:56.2136644') AS minDiff1
select DATEDIFF(MINUTE,  '00:35:56.2136644', '22:35:55.043') AS minDiff2
select DATEDIFF(MINUTE, '22:35:55.043', '00:35:56.2136644') AS minDiff3
select DATEDIFF(MINUTE, '00:35:56.2136644'22:35:55.043') AS minDiff4

На данный момент вы, похоже, не учитываете факт, что DATEDIFF направлен, то есть он учитывает (переданные единицы первого аргумента) ОТ второго аргумента до третьего аргумента,Таким образом, поскольку 00:35 на 1320 минут раньше, чем 22:35 (того же дня), 00:35 -> 22:35 возвращает 1320, тогда как 22:35 -> 00:35 возвращает -1320.


Если быть точным, поскольку DATEDIFF использует datetime, строки, представляющие время / время, неявно преобразуются в даты.Поскольку дата не указана вами, используется дата со значением 0: 1 января 1900 года. Это обычный день, в который действует функция.

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