СУММА группы временных различий в T-SQL? - PullRequest
0 голосов
/ 04 ноября 2018

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

select 
    aaaa
from 
    employee B 
inner join 
    (select 
         s.emp_reader_id,
         Sum(case  when  s.in_time is not null and s.out_time is not null  and s.shift_type_id=5 and  LOWER(DATENAME(dw, [att_date]))='friday'then   
cast(datediff(minute,'00:00:00', '23:59:59') / 60 +
     (datediff(minute,'00:00:00', '23:59:59') % 60 / 100.0) as decimal(7, 4)
           ) end) as aaaa
     from 
         Daily_attendance_data s 
     left outer join 
         employee bb on s.emp_reader_id = bb.emp_reader_id
     where 
         att_date between '2018-10-01' and '2018-10-31' 
         and s.emp_reader_id = 1039
     group by 
         s.emp_reader_id) A on B.emp_reader_id = A.emp_reader_id 

Токовый выход:

aaaa
47.1800

, который дает список раз по часам, но затем я хочу подвести его к общей сумме.

Это будет всего

Пример данных:

23:59
23:59

Ожидаемый результат:

47.58

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Если тип вашей даты DateTime.

вы можете попытаться разделить вашу ценность на две части.

  1. hours получить значение, необходимое для переноса из минут, так что SUM(intpart) + SUM(floatpart) / 60
  2. minutes получить значение из SUM(floatpart) % 60

выглядит так.

SELECT concat(SUM(intpart) + SUM(floatpart) / 60,':', SUM(floatpart) % 60)
FROM (
    SELECT cast(SUBSTRING (cast(col as varchar),0,3) as int) intpart,
           cast(SUBSTRING (cast(col as varchar),CHARINDEX(':',col) +1,2)as int) floatpart
    FROM T
) t1

sqlfiddle

0 голосов
/ 04 ноября 2018

Я думаю, вы должны преобразовать все время в секунды, рассчитать сумму, а затем преобразовать сумму в HH:mm:ss.

  1. Рассчитать сумму секунд

    DECLARE @TimeinSecond as integer = 0
    
    select @TimeinSecond = Sum(DATEDIFF(SECOND, '0:00:00', [WorkHrs]))
    from Daily_attendance_data 
    
  2. Преобразование ЧЧ: мм: сс Формат

    SELECT RIGHT('0' + CAST(@TimeinSecond / 3600 AS VARCHAR),2) + ':' +
    RIGHT('0' + CAST((@TimeinSecond / 60) % 60 AS VARCHAR),2) + ':' +
    RIGHT('0' + CAST(@TimeinSecond % 60 AS VARCHAR),2)
    

Ссылки

...