Vika7
@Vika7
вебист

Tsrange вывод временных интервалов (vol2)?

Вопрос в запросе количества свободных интервалов для занятой комнаты.
В ответ на первый топик было предложено пойти по пути разделения дня на временные отрезки (15,30,45 ... мин), и в случае наложения рэнджа исключение данных промежутков. Это привело к тому, что часовые отрезки всегда будут начинаться с ровно с 12.00, 13.00, 14.00 ..., а это контрпродуктивно, потому, что в случае если последний резерв закончился в 12.10. 50 минут будет простоя.
В SO был предложен иной подход. Для начала определяется весь свободный тайминг, а далее отфильтровать по длительности. Автор топиков совсем не сильна в SQL.

Помогите с фильтрацией.

CREATE TABLE reservation (room int, during tsrange);
INSERT INTO reservation VALUES
    (1108, '[2010-01-01 09:30, 2010-01-01 10:30)');

WITH mins(lt) AS (
   /* get all lower bounds of intervals */
   SELECT lower(during)
   FROM reservation
   UNION
   /* get 18:00 for each day */
   SELECT date_trunc('day', lower(during)) + INTERVAL '18 hours'
   FROM reservation
), maxs(ut) AS (
   /* get all upper bounds of intervals */
   SELECT upper(during)
   FROM reservation
   UNION
   /* get 09:00 for each day */
   SELECT date_trunc('day', lower(during)) + INTERVAL '9 hours'
   FROM reservation
)
SELECT tsrange(ut, lt)  /* candidate for a free interval */
FROM mins
   JOIN maxs
      ON date_trunc('day', lt) = date_trunc('day', ut)
         AND ut < lt
/* exclude all such intervals that overlap an entry */
WHERE NOT EXISTS (SELECT 1 FROM reservation
                  WHERE during && tsrange(ut, lt, '()'))
ORDER BY ut;
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы