Найти перекрывающееся время между двумя временными метками в postgresql - PullRequest
1 голос
/ 01 апреля 2020

У меня есть таблица в постгерах с похожей схемой.

id            start_time            end_time
1    2019-10-21 20:00:00 UTC    2019-10-21 23:00:00 UTC
2    2019-10-21 22:00:00 UTC    2019-10-22 02:00:00 UTC

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

например: дано два входа t1=2019-10-21 21:00:00 UTC t2=2019-10-22 01:00:00 UTC запрос должен рассчитать все время перекрытия между входным диапазоном

время перекрытия между входом и строкой 1 равно 2 hrs время перекрытия между входом и строкой 2 равно 3 hrs результат будет 2 + 3 = 5

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Вы можете использовать арифметику даты и агрегацию:

select 
    sum(
        greatest(
            least(d.end_time, t.end_time) - greatest(d.start_time, t.start_time), 
            '0 hour'::interval
        )
    ) total_overlap
from mytable t
cross join (values 
    ('2019-10-21 21:00:00'::timestamp, '2019-10-22 01:00:00'::timestamp)
) d(start_time, end_time)

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

1 голос
/ 01 апреля 2020

Звучит так, как будто вы ищете пересечение двух значений 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.

Онлайн пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...