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;