Самый простой способ это просто извлечь эпоху (количество секунд) на интервале (разность между временными метками).
Что касается перекрывающихся сумм, вам необходимо сначала разбить его на час. Некоторые из этих часов не существуют, поэтому вам нужно сгенерировать их с помощью предложения 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
Возможно, имеются некоторые кромки или дополнительная фильтрация, если ваши данные не такие чистые.