如何将具有混合值的varchar(10)
转换为时间并计算时间值未一致格式化的记录集的总时间?
这些值已按如下方式输入:
9:57
4:26
6:05
14:17
0:44
1:17
72:50
总时间应该是01:48:56(1小时48分56秒)
我已经尝试了两个:CAST(Tracktime) AS TIME
和CONVERT(TIME,Tracktime)
但都没有工作。我需要完成数十万条记录,因此通过手动替换所有原始数据并不容易解决。
答案 0 :(得分:0)
您无法将您的值转换为时间或日期时间,因为72:50是不兼容的时间。所以你需要手动计算总数。查询计算总秒数,然后转换为所需格式
declare @t table (dt varchar(10))
insert into @t
values ('9:57'), ('4:26'), ('6:05')
, ('14:17'), ('0:44'), ('1:17'), ('72:50')
select
right(concat('0', seconds / 3600), 2) + ':' + right(concat('0', seconds % 3600 / 60), 2)
+ ':' + right(concat('0', seconds % 60), 2)
from (
select
seconds = sum(left(dt, ci-1) * 60 + substring(dt, ci + 1, len(dt)))
from
@t
cross apply (select ci = charindex(':', dt)) q
) t
Concat
可从SQL Server 2012获得。如果您的版本较低,只需将计算值转换为varchar,然后再与' 0'
答案 1 :(得分:0)
试试这个:
declare @t table (dt varchar(10))
insert into @t
values ('9:57'), ('4:26'), ('6:05'), ('14:17'), ('0:44'), ('1:17'), ('72:50')
select ([sum_min]+[sum_sec]/60)/60 [hours],--(amount of minutes)/60, i.e. how many hours
([sum_min]+[sum_sec]/60)%60 [minutes],--how many minutes
[sum_sec]%60 [seconds]--how many seconds
from (
--simple casting text to integers and summing them
select sum(cast(SUBSTRING(dt,1,charindex(':',dt)-1) as int)) [sum_min],
sum(cast(SUBSTRING(dt,charindex(':',dt)+1,2) as int)) [sum_sec]
from @t
) [a]