Vika7
@Vika7
вебист

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

Имею таблицу с резервом комнаты:

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


Помогите с запросами: О количестве свободных интервалов для этой комнаты 30 мин, 45мин, 1 час и 1.30 минут в течение дня, с 09.00 до 18.00.

Вывод:

30 мин
1. 09.00 - 09.30
2. 10.30 - 11.00
3. 11.30. -12.00
....

45 мин
1. 10.30 - 11.15
2. 11.15 - 12.00
...

1 час
1. 10.30. - 11.30
2. 11.30 - 12.30
....
  • Вопрос задан
  • 858 просмотров
Пригласить эксперта
Ответы на вопрос 2
@ponaehal
В принципе можно решить и "в лоб" но лень...

В порядке бреда:
Заполнить таблицу временными минимальными доступными временными интервалами в промежутке с 9 до 18 (создать расписание).
В вашем случае это будет 18 тридцатиминутных интервалов (всего 18 строк).
Далее, например, в случае резервирования на час, резервировал бы сразу 2 интервала.

А потом все сводится к банальному UNION ALL
SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 30 равен 0>
UNION ALL
SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 45 равен 0>
UNION ALL
SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 60 равен 0>
UNION ALL
SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 90 равен 0>
Ответ написан
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Оно?
with
  all_ranges as (
    SELECT tsrange(generate_series, 
                   generate_series + interval '30' minute, 
                   '()') as range 
    FROM generate_series(current_date::timestamp + interval '9' hour,
                         current_date::timestamp + interval '18' hour, 
                         '30 minutes'))      
select rooms.id as room_id,
       concat(to_char(lower(ar.range), 'HH24:MI'), 
              ' - ', 
              to_char(upper(ar.range), 'HH24:MI')) as timerange
from all_ranges as ar
cross join rooms 
where not exists (select 1 
                  from reservations as rt
                  where rooms.id=rt.room_id and 
                        ar.range && rt.occurrence)
order by 1;

SQL Fiddle
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы