Давайте сначала пересмотрим ваши примеры:
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 года. Это обычный день, в который действует функция.