SQL сервер Конвертировать varchar во время и рассчитать общее время - PullRequest
0 голосов
/ 27 апреля 2018

Как я могу преобразовать 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), но ни одна из них не работает. Мне нужно проработать сотни тысяч записей, поэтому исправить это не так-то просто, вручную заменив все исходные данные.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Попробуйте это:

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]
0 голосов
/ 27 апреля 2018

Вы не можете преобразовать свои значения во время или дату / время, так как 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'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...