SQL server将varchar转换为time并计算总时间

时间:2018-04-27 05:34:22

标签: sql sql-server sql-server-2008 tsql

如何将具有混合值的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 TIMECONVERT(TIME,Tracktime)但都没有工作。我需要完成数十万条记录,因此通过手动替换所有原始数据并不容易解决。

2 个答案:

答案 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]