Звучит так, как будто вы ищете пересечение двух значений tsrange :
tsrange(start_time, end_time, '[]') * tsrange('2019-10-21 21:00:00', '2019-10-22 01:00:00', '[]')
'[]'
указывает, что оба края должны быть включены в диапазон. Это может или не может быть то, что вы хотите. Вам нужно будет настроить это в соответствии с вашими требованиями.
Это вернет тип диапазона. Чтобы вычислить длину диапазона, вычтите верхнее значение из нижнего значения:
select sum(upper(diff) - lower(diff))
from (
select tsrange(start_time, end_time, '[]') * tsrange('2019-10-21 21:00:00', '2019-10-22 01:00:00', '[]') as diff
from the_table
) t
Возвращает интервал , представляющий сумму всех перекрытий.
Если ваш столбец - timestamp with time zone
, вам нужно использовать tstzrange
.
Онлайн пример