Самый простой способ - просто извлечь эпоху (количество секунд) на интервале (разницу между временными метками).
Что касается перекрывающихся сумм, вам нужно сначала разбить их на час. Некоторые из этих часов не существуют, поэтому вам нужно сгенерировать их, используя предложение TIMESERIES
.
Идея будет состоять в том, чтобы сначала создать свои часовые временные интервалы, а затем тэта-соединение, чтобы найти (и развернуть) все возможные совпадения по этому вопросу. Это в основном ищет любое перекрытие временного диапазона. К счастью, это довольно просто, поскольку время начала до конца среза находится где угодно, а время окончания больше, чем начало среза.
Затем вы используете наибольшие и наименьшие значения, чтобы найти фактическое время для запуска и остановки в пределах среза, вычесть их, преобразовать интервал в секунды и сделать.
См. Пример ниже.
with slices as (
select slice_time slice_time_start, slice_time + interval '1 hour' slice_time_end
from (
select min(start_time) time_range from mytest
union all
select max(end_time) from mytest
) range
timeseries slice_time as '1 HOUR' over (order by range.time_range)
)
select slice_time_start "hour", extract(epoch from sum( least(end_time, slice_time_end)-greatest(slice_time_start, start_time))) secs_in_that_hour
from slices join mytest on ( start_time < slice_time_end and end_time > slice_time_start)
group by 1
order by 1
Там могут быть некоторые крайние случаи или поэтому необходима дополнительная фильтрация, если ваши данные не так чисты.