SQL服务器,将天数,小时数,分钟数转换为秒数

时间:2018-02-13 10:32:46

标签: sql-server

我有一个包含NVARCHAR值的数据库列,表示以天,小时,分钟和秒为单位的系统启动时间(例如,1d 21h 59m 48s)。我真的很想写一个查询,以便能够以简单易读的格式向我显示时间,但我不太确定该怎么做。

Response_Time_AVG           Need to convert into seconds   
28m                        1680(Manually done)   
2h 8m                      7680(Manually done)
15m 4s          
11h 14m                 
1h 9m 6s                
15h 7m 6s               
10h 12m 2s              
10h 19m 40s             
1d 5h 54m 6s            
1d 1h 23m 48s           
1d 21h 59m 48s          

2 个答案:

答案 0 :(得分:1)

由于我不知道您使用的是什么版本的SQL Server,而且我现在无法访问SQL Server 2016或更高版本,因此我在这里使用了Jeff Moden的DelimitedSplit8K。如果您有更高版本,可以使用STRING_SPLIT或任何其他您喜欢的String Splitter。

无论如何,首先我在白色空间拆分了时间段。然后我JOIN在一组值上,这些值在一段时间内(秒,分钟,小时和天)具有适当的第二个值。 WHERE只会在出现双倍空格(' ')时进行过滤,因为会发生错误。

然后,在SELECT中,就像将值乘以它所代表的秒数一样简单:

WITH TimeValues AS(
    SELECT RTRIM(V.TS) AS TS
    FROM (VALUES ('28m           '),
                 ('2h 8m         '),
                 ('15m 4s        '),  
                 ('11h 14m       '),          
                 ('1h 9m 6s      '),          
                 ('15h 7m 6s     '),          
                 ('10h 12m 2s    '),          
                 ('10h 19m 40s   '),          
                 ('1d 5h 54m 6s  '),          
                 ('1d 1h 23m 48s '),          
                 ('1d 21h 59m 48s')) V(TS))
SELECT TV.TS,
       SUM(LEFT(DS.Item, LEN(DS.Item) - 1) * SV.Seconds) AS TotalSeconds
FROM TimeValues TV
     CROSS APPLY dbo.DelimitedSplit8K(TV.TS,' ') DS
     JOIN (VALUES ('s',1),('m',60),('h',3600),('d',86400)) SV(TimePeriod, Seconds) ON SV.TimePeriod = RIGHT(DS.Item,1)
GROUP BY TV.TS
ORDER BY TotalSeconds;

输出:

TS             TotalSeconds
-------------- ------------
15m 4s         904
28m            1680
1h 9m 6s       4146
2h 8m          7680
10h 12m 2s     36722
10h 19m 40s    37180
11h 14m        40440
15h 7m 6s      54426
1d 1h 23m 48s  91428
1d 5h 54m 6s   107646
1d 21h 59m 48s 165588

注;我在这里使用了varchar,而不是nvarchar。如果您使用此拆分器,请确保使用nvarchar版本。

答案 1 :(得分:0)

试试这个:

with cte  as
(select '28m'  time
union                      
select '2h 8m'  time
union                     
select '15m 4s' time
union select '1d 5h 54m 6s'
union select '1d 21h 59m 48s' union select '10h 12m 2s')

select time, substring(time,CHARINDEX('d', time)-2,2)*86400 + 
substring(time,CHARINDEX('h', time)-2,2)*3600 + 
substring(time,CHARINDEX('m', time)-2,2)*60 + 
substring(time,CHARINDEX('s', time)-2,2) sec from cte 

输出:

time             sec
2h 8m            7680
10h 12m 2s       36722
15m 4s           904
1d 21h 59m 48s   165588
1d 5h 54m 6s     107646
28m              1680