使用Datediff

时间:2019-06-17 05:07:46

标签: sql-server tsql sql-server-2014

我试图从日期时间字段中提取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

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

是因为格式具有12小时制,而convert具有24小时制?是否可以更改“格式化”功能的时间格式。谁能帮我解释一下,并在可能的情况下使用Format函数更改行为?

3 个答案:

答案 0 :(得分:1)

尝试使用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

答案 1 :(得分:0)

我认为hh和HH表示不同的结果,hh看起来像是12小时制,而HH是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

答案 2 :(得分:0)

我意识到您已经接受了答案,但是如果我要在几分钟内计算出差异,我发现将它们转换为浮点数并执行一些简单的算术要容易得多。

为完整起见,在此处添加了答案。

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