SQL抓住两个日期之间的酒店客房供应情况

时间:2015-03-31 19:37:28

标签: sql oracle select join to-date

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

这就是我所拥有的:

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日)

如何更改此代码以接收两个日期,签入结帐,同时还提供可用的房间而不是带走的房间。

非常感谢任何帮助!

3 个答案:

答案 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')
    )