2013-08-14 4 views
7

Я столкнулся с проблемой в поиске суммы значений, хранящихся в столбце,Как получить сумму времени поля в SQL сервере 2008

У меня есть таблица вроде этого:

gs_cycle_no | from_time | to_time | total_hours(varchar) ... 
GSC-334/2012 | 13:00  | 7:00  | 42:00 
GSC-334/2012 | 8:30  | 3:45  | 6:00 
. 
. 
. 

Что я необходимо найти группу Sum(total_hours) по gs_cycle_no. Но метод Sum не будет работать на колонке VARCHAR, а также я не могу преобразовать его в десятичную из-за его формата,

Как я могу найти sum из total_hours колонны, на основе gs_cycle_no?

+1

Что означает значение '42: 00'? 42 часов и 0 минут? – GolfWolf

ответ

5

, если у вас нет минут и всего за несколько часов, то вы можете сделать что-то вроде:

select 
    cast(sum(cast(replace(total_hours, ':', '') as int)/100) as nvarchar(max)) + ':00' 
from Table1 
group by gs_cycle_no 

, если вы этого не сделаете, попробуйте это:

with cte as 
(
    select 
     gs_cycle_no, 
     sum(cast(left(total_hours, len(total_hours) - 3) as int)) as h, 
     sum(cast(right(total_hours, 2) as int)) as m 
    from Table1 
    group by gs_cycle_no 
) 
select 
    gs_cycle_no, 
    cast(h + m/60 as nvarchar(max)) + ':' + 
    right('00' + cast(m % 60 as nvarchar(max)), 2) 
from cte 

sql fiddle demo

+0

первый работает только целыми часами, как написано, пропущен группой в секунду, спасибо за это –

+0

72:25 - см. Http://sqlfiddle.com/#!3/b81ab/1 –

+0

@OzrenTkalcecKrznaric, как вы это протестировали? :) –

0

Этот запрос находит сумму в минутах:

SQLFiddle demo

select gs_cycle_no, 

    SUM(
    CAST(
    ISNULL(
    substring(total_hours,1,CHARINDEX(':',total_hours)-1) 
    ,'0') as INT) * 60 
    + 
    CAST(
    ISNULL(
    substring(total_hours,CHARINDEX(':',total_hours)+1,100) 
    ,'0') as INT) 
    ) 
    from t 
group by gs_cycle_no 
+0

Результаты выводят минуты, а не часы – OzrenTkalcecKrznaric

0

Вот решение, в котором я нарушу VARCHAR на две небольшие кусочки, часы и минуты, а затем сделать минут из них, и, наконец, SUM их:

SELECT 
    gs_cycle_no, 
    CAST(SUM(
     SUBSTRING(total_hours,0 ,CHARINDEX(':', total_hours)) * 60 + 
     SUBSTRING(total_hours, CHARINDEX(':', total_hours) + 1, LEN(total_hours)))/60 AS VARCHAR) + ':' + 
    CAST(SUM(
     SUBSTRING(total_hours,0 ,CHARINDEX(':', total_hours)) * 60 + 
     SUBSTRING(total_hours, CHARINDEX(':', total_hours) + 1, LEN(total_hours))) % 60 AS VARCHAR) 
FROM Table1 
GROUP BY gs_cycle_no 
1

Это будет работать:

;with times as (
    select gs_cycle_no = 'GSC-334/2012', total_hours = '8:35' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '5:00' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '16:50' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '42:00' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '0:00' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '175:52' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '12:25') 
SELECT 
    gs_cycle_no, 
    hrs = sum(mins)/60 + sum(hrs), 
    mins = sum(mins) % 60 
FROM 
    TIMES 
    cross apply(
     select c = charindex(':', total_hours) 
    ) idx 
    cross apply(
     select 
      hrs = cast(substring(total_hours, 1, c - 1) as int), 
      mins = cast(substring(total_hours, c + 1, len(total_hours)) as int) 
    ) ext 
group by gs_cycle_no 
order by gs_cycle_no 
Смежные вопросы