我有一个包含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
答案 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