SQL Grabbing наличие гостиничного номера между двумя датами

Как следует из названия, я пытаюсь захватить все доступные гостиничные номера, когда пользователь указывает дату заезда и выезда. Я добился определенного прогресса, но я изо всех сил пытаюсь понять логику этого процесса.

Вот что у меня есть:

SELECT r.FLOOR, r.ROOM
FROM BOOKING b, ROOMS r
WHERE TO_DATE('2015-03-28', 'YYYY-MM-DD')
BETWEEN TO_DATE(b.CHECKIN, 'YY-MM-DD') AND TO_DATE(b.CHECKOUT, 'YY-MM-DD')
AND r.ROOMID = b.ROOMID;

Это просто возвращает все занятые комнаты на указанную дату. (2015-03-28)

Как я могу изменить этот код так, чтобы он брал две даты, регистрируясь на кассе, а также предоставлял свободные номера вместо занятых.

Любая помощь высоко ценится!

3 ответа

Решение

Вы можете использовать функцию Oracle wm_overlaps, которая находит перекрывающиеся промежутки времени:

select *
from rooms
where roomid not in 
(
  select b.room_id
  from booking b
  where wm_overlaps (
    wm_period(b.checkin, b.checkout),
    wm_period(
      to_date('2014-01-01', 'yyyy-mm-dd'), 
      to_date('2014-01-05', 'yyyy-mm-dd')
    )
  ) = 1
)

В этом запросе номера не имеют бронирования между обоими заданными параметрами.

Это может быть ближе. Подставьте параметры (помеченные @) как соответствующие:

SELECT r.FLOOR, r.ROOM
FROM ROOMS r
WHERE r.ROOMID NOT IN (
    -- exclude rooms where checkin or checkout overlaps with the desired dates
    SELECT r.ROOMID
    FROM BOOKING b
    WHERE (
            b.CHECKIN  BETWEEN TO_DATE(@CHECKIN, 'YY-MM-DD') AND TO_DATE(@CHECKOUT, 'YY-MM-DD')
        OR  b.CHECKOUT BETWEEN TO_DATE(@CHECKIN, 'YY-MM-DD') AND TO_DATE(@CHECKOUT, 'YY-MM-DD')
    )

Попробуйте получить список всех комнат и исключить из него забронированный набор, например

SELECT r.FLOOR, r.ROOM
FROM ROOMS r
EXCEPT
SELECT r.FLOOR, r.ROOM
FROM BOOKING b, ROOMS r
WHERE TO_DATE('2015-03-28', 'YYYY-MM-DD')
BETWEEN TO_DATE(b.CHECKIN, 'YY-MM-DD') AND TO_DATE(b.CHECKOUT, 'YY-MM-DD')
AND r.ROOMID = b.ROOMID;
Другие вопросы по тегам