Разница в поведении с конвертированием 108 и форматированием при использовании Datediff - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь извлечь часть ЧЧ: ММ: СС из поля даты и времени и использовать ее для получения разницы в датах в минутах между извлеченными частями.Однако я получаю другое поведение с convert (108), который дает мне точные результаты, а формат - неверные.

declare @DATE1 SMALLDATETIME = '2019-02-22 06:15:00' 
, @DATE2 SMALLDATETIME = '2019-02-22 14:15:00' 

 select datediff( minute, convert(varchar(10), @DATE1,108) 
,convert(varchar(10), @DATE2,108) ) [Total Mins from Convert], 
convert(varchar(10), @DATE1,108) [Value from Convert] ,  
format(@DATE1,'hh:mm:ss') [Value from Format]  ,
 datediff( minute,  cast(format(@DATE1,'hh:mm:ss') as time) , 
cast(format(@DATE2,'hh:mm:ss') as time) ) [Total Mins from Format]

Вывод:

  Total Mins from Convert   Value from Convert  Value from Format   Total Mins from Format
480                             06:15:00        06:15:00                  -240

Я могу использовать преобразование без каких-либо проблем, чтобы правильно получить разницу в датах, но хотел понять, почему формат показывает различия, когда ЧЧ: ММ: СС одинаковыс конвертированием.Если я даю переменную @ date2 <= 12 часов вечера, это дает мне правильные результаты как с «Форматом», так и с «Преобразованием», однако, если мой @hour больше 12 часов вечера, например, 14:15 в этом примере, это дает мне неверные результаты.,</p>

это потому, что формат имеет 12-часовой формат времени, а конвертировать - 24-часовой формат?Можно ли изменить формат времени для функции «Формат».Может ли кто-нибудь помочь мне с объяснением и изменением поведения с помощью функции Формат, если это возможно?

Ответы [ 3 ]

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

Попробуйте использовать HH для представления 24-часового времени:

SELECT
    DATEDIFF(minute, CONVERT(varchar(10), @DATE1, 108),
        CONVERT(varchar(10), @DATE2, 108)) [Total Mins from Convert], 
    CONVERT(varchar(10), @DATE1, 108) [Value from Convert],
    FORMAT(@DATE1,'HH:mm:ss') [Value from Format],
    DATEDIFF(minute, CAST(FORMAT(@DATE1,'hh:mm:ss') AS time),
        CAST(FORMAT(@DATE2, 'HH:mm:ss') AS time)) [Total Mins from Format];

Это выводит 480 для обоих значений минут и 06:15:00 для обоих раз.

0 голосов
/ 17 июня 2019

Я понимаю, что вы уже приняли ответ, но если бы я рассчитал разницу в минутах, я обнаружил бы, что гораздо проще преобразовать их в числа с плавающей точкой и выполнить простую арифметику.

Ответ добавлен здесь дляполнота.

declare @DATE1 SMALLDATETIME = '2019-02-22 06:15:00' 
, @DATE2 SMALLDATETIME = '2019-02-22 14:15:00' 

select convert(float,@date2-@date1)*24*60 as DiffInMinutes

Результат:

DiffInMinutes
480
0 голосов
/ 17 июня 2019

Я думаю, что чч и чч подразумевают разные результаты, чч - это 12-часовой формат, как выглядит, а чч - 24-часовой формат.

объяснено здесь ясно:

https://www.mssqltips.com/sqlservertip/2655/format-sql-server-dates-with-format-function/

select datediff( minute, convert(varchar(10), @DATE1,108) ,convert(varchar(10), @DATE2,108) ) [Total Mins from Convert], 
convert(varchar(10), @DATE1,108) [Value from Convert] ,  
format(@DATE1,'HH:mm:ss') [Value from Format]  ,
 datediff( minute,  cast(format(@DATE1,'HH:mm:ss') as time) , cast(format(@DATE2,'HH:mm:ss') as time) ) [Total Mins from Format]

Теперь результаты выглядят так:

Total Mins from Convert   Value from Convert  Value from Format   Total Mins from Format
480                             06:15:00        06:15:00                  -240
...