Суммирование отметки времени возвращает неверное значение и формат

Я хочу вытащить запланированные часы в определенный период времени. Время начала и окончания - это даты, поэтому я преобразовал их в метки времени. Когда я не суммирую их, все выглядит правильно, но когда я суммирую их за период времени, результат не в формате временной метки, и числа неверны.

Я использую запрос:

select sal.public_name, sum(timediff(timestamp(end_time), timestamp(start_time)))
from bi.support_agents_list sal
join bi.support_sp_shifts_scheduled ss
on ss.agent_sp_id = sal.sp_id
join bi.support_sp_shifts s 
on s.pk_id = ss.pk_id
where date(start_time) between '2014-01-29' and '2014-01-31'
group by sal.public_name

Несколько примеров получаемых мной результатов:

Агент 1: 53000 - когда должно быть 5,5 часов или 5:30

агент 2: 196000 - когда должно быть 20 часов

Есть мысли по этому поводу? Я бы предпочел, чтобы мой вывод отображался в часах, поэтому 5 часов 30 минут форматируются как 5,5, а не 5:30.


person user3258198    schedule 31.01.2014    source источник


Ответы (2)


попробуйте это вместо суммы

   date_format(timediff(timestamp(end_time), timestamp(start_time)), 
   '%k hours, %i minutes, %s seconds') as thesum

как это

 select sal.public_name, 
   date_format(timediff(timestamp(end_time), timestamp(start_time)), '%k hours, %i minutes, %s seconds') as thesum
 from bi.support_agents_list sal
person echo_Me    schedule 31.01.2014
comment
Спасибо. Когда я это делаю, он работает для одного разницы во времени, но когда я их суммирую, результат округляется. поэтому для агента 1 он дает мне 5, а не 5,5 или 5:30 - person user3258198; 31.01.2014
comment
как вы их суммируете, приведите свой пример. - person echo_Me; 31.01.2014

При выполнении агрегированных вычислений с суммой datetime (datetime) результат не такой, как вы ожидаете (= невозможно суммировать datetime). Лучше преобразовать дату и время в секунды до агрегатной функции, а затем преобразовать обратно во время.

Тогда ваш вызов агрегированной функции будет выглядеть примерно так:

select sec_to_time(sum(unix_timestamp(end_time)-unix_timestamp(start_time)))

Имейте в виду, что вы можете достичь максимального значения, которое может содержать тип данных time, и что unix_timestamp начинается с 1970 года.

person slaakso    schedule 31.01.2014