0

正如标题所述,当用户指定入住和退房日期时,我试图获取所有可用的酒店房间。我已经取得了一些进展,但我很难理解这个过程背后的逻辑。

这是我所拥有的:

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)

如何更改此代码以接受两个日期,签到结帐,同时还提供可用房间而不是已占用房间。

任何帮助深表感谢!

4

3 回答 3

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
)

在此查询中,房间在两个给定参数之间没有预订。

于 2015-03-31T20:18:03.690 回答
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;
于 2015-03-31T19:47:23.543 回答
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')
    )
于 2015-03-31T20:01:00.630 回答