正如标题所述,当用户指定入住和退房日期时,我正试图抓住所有可用的酒店房间。我已经取得了一些进展,但我很难理解这个过程背后的逻辑。
这就是我所拥有的:
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年3月28日)
如何更改此代码以接收两个日期,签入结帐,同时还提供可用的房间而不是带走的房间。
非常感谢任何帮助!
答案 0 :(得分:2)
您可以使用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
)
在此查询中,房间在两个给定参数之间没有预订。
答案 1 :(得分:0)
尝试获取所有房间的列表并从预订集中排除,例如
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;
答案 2 :(得分:0)
这可能更接近了。用适当的方式替换参数(用@标记):
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')
)