Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL抓取两个日期之间的酒店客房可用性_Sql_Oracle_Select_Join_To Date - Fatal编程技术网

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份订单;