Как получить сумму поля времени в SQL Server 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

7 голосов | спросил Dadapeer Pvg 14 AM000000100000000431 2013, 10:31:04

4 ответа


0

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

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

ответил Roman Pekar 14 AM000000100000003031 2013, 10:45:30
0

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

;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
ответил OzrenTkalcecKrznaric 14 AM000000100000005531 2013, 10:55:55
0

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

демонстрация SQLFiddle

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
ответил valex 14 AM000000100000004231 2013, 10:48:42
0

Вот решение, где я разбиваю varchar на две маленькие части, часы и минуты, а затем делаю из них минуты и, наконец, СУММАЮ их:

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
ответил veljasije 14 AM000000100000003131 2013, 10:49:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132