【问题标题】:SQL Grabbing hotel room availability between two datesSQL 抓取两个日期之间的酒店客房供应情况
【发布时间】:2015-06-05 06:57:45
【问题描述】:

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

这是我所拥有的:

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)

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

非常感谢任何帮助!

【问题讨论】:

    标签: sql oracle select join to-date


    【解决方案1】:

    您可以使用 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
    )
    

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

    【讨论】:

    • 这正是我想要的!我对其进行了一些修改,以更好地适应我需要的结果。 select bu.name, r.floor, r.room from rooms r, building bu, roomtypes rt where r.ROOMTYPEID = rt.ROOMTYPEID AND rt.BUILDINGID = bu.BUILDINGID AND roomid not in ( select b.roomid from booking b where wm_overlaps ( wm_period(b.checkin, b.checkout), wm_period( to_date('2015-03-25', 'yyyy-mm-dd'), to_date('2015-04-05', 'yyyy-mm-dd') ) ) = 1 ) ORDER BY r.floor;
    【解决方案2】:

    例如,尝试获取所有房间的列表并将其排除在预订集之外

    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;
    

    【讨论】:

    • 有趣...我在网上使用了一些示例,但它们都给我语法错误,我使用的是 Oracle,也许这是问题所在?
    • 你遇到了什么错误?在 Oracle 中,您可以尝试使用 MINUS 代替 EXCEPT
    • 是的,将其切换到 MINUS 有效,现在除了两个日期外,我如何获得相同的结果?假设我想做多个日期,例如:2015-03-28 到 2015-04-05。
    【解决方案3】:

    这可能更接近。酌情替换参数(标有@):

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

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多