我试图从日期时间字段中提取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函数更改行为?
答案 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