首页 > 解决方案 > 使用 Datediff 时转换 108 和格式的行为差异

问题描述

我正在尝试从日期时间字段中提取 HH:MM:SS 部分,并使用它来获取提取部分之间的日期差异(以分钟为单位)。但是,我使用 conver (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

我可以毫无问题地使用转换来正确获取日期差异,但想了解为什么当 HH:MM:SS 与转换相同时 Format 会显示差异。如果我给@date2 变量<= 12 pm 它给了我正确的“格式”和“转换”结果,但是如果我的@hour 超过12 pm 像这个例子中的14:15 它给我不正确的结果.

是因为 format 有 12 小时时间格式,而 convert 有 24 小时时间格式吗?是否可以更改“格式”功能的时间格式。如果可能的话,任何人都可以帮助我解释和改变 Format 函数的行为吗?

标签: sql-servertsqlsql-server-2014

解决方案


尝试使用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两个时间。


推荐阅读