SQL抓取两个日期之间的酒店客房可用性
正如标题所述,当用户指定入住和退房日期时,我试图获取所有可用的酒店房间。我已经取得了一些进展,但我正在努力理解这个过程背后的逻辑 以下是我所拥有的:SQL抓取两个日期之间的酒店客房可用性,sql,oracle,select,join,to-date,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.ROOMI
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
如何将此代码更改为接收两个日期,签入一个签出,同时提供可用房间而不是已预订房间
非常感谢您的帮助 例如,尝试获取所有房间的列表并从中排除预订集
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;
这可能更接近。用@替换标记的参数(视情况而定):
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')
)
您可以使用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
)
在这个查询中,两个给定参数之间的房间没有预订。有趣。。。我在网上用了一些例子,但是它们都给了我语法错误,我在用Oracle,也许这就是问题所在?你得到了什么样的错误?在甲骨文中,你可以试着用减号来代替例外。如果把它改成减号,那么除了两个日期之外,我怎么能得到相同的结果呢?假设我想做多个约会,例如:2015-03-28到2015-04-05。这正是我想要的!我对它做了一些修改,以更好地适应我需要的结果。从房间r中选择bu.name、r.floor、r.room、building bu、roomtypes rt,其中r.ROOMTYPEID=rt.ROOMTYPEID和rt.BUILDINGID=bu.BUILDINGID和roomid不在。从wm_与wm_周期重叠的预订b中选择b.roomid b.checkin、b.checkout、wm_周期至日期2015-03-25’、‘yyyy-mm-dd’、‘2015-04-05’,“yyyy-mm-dd”=r.floor的1份订单;