【问题标题】:Show available rooms between to dates? SQL显示截止日期之间的可用房间? SQL
【发布时间】:2014-08-08 17:21:50
【问题描述】:

我希望有人可以在这里给我一些帮助......

我正在为一家酒店编写一个小预订程序,在那里我应该能够看到两个给定日期之间的可用房间列表。我遇到了一个问题,如果我搜索的到达日期晚于预订的到达日期,房间仍将显示为可用...

我对数据库的调用如下所示:

String SQLString = "select roomnumber, roomtypeid from rooms "
        + "where roomnumber not in "
        + "(select roomnumber from booking "
        + "where arrival between to_date(?, 'yyyy-mm-dd') "
        + "and to_date(?, 'yyyy-mm-dd')) and roomtypeid = ? order by roomnumber";

我尝试了一些不同的 sql 字符串组合,但没有任何帮助。谁能给我一个好的提示?

CREATE TABLE BOOKING(
ARRIVAL             DATE ,
DEPARTURE           DATE,
RESERVATIONSNUMBER  INTEGER NOT NULL PRIMARY KEY,
ROOMNUMBER          INTEGER,
PAID                INTEGER,
CUSTOMERID INTEGER,
NUMBEROFGUESTS INTEGER,
CONSTRAINT BOFK FOREIGN KEY(ROOMNUMBER) REFERENCES ROOMS(ROOMNUMBER),
CONSTRAINT CUIDFK FOREIGN KEY(CUSTOMERID) REFERENCES CUSTOMER(CUSTOMERID));

【问题讨论】:

  • 您能提供更多关于您的数据库的信息吗?预订表是如何定义的?
  • 可以添加纯 SQL 吗?
  • 我将添加预订表的sql。
  • 确保您在 Java 代码中传递了正确的日期。验证后,检查子查询的结果 - 它是否包含您需要排除的房间?

标签: java sql querying


【解决方案1】:

以下是查找重叠预订的方法。如果不认为同一天有问题,您可能需要将 = 更改为 。

select roomnumber, roomtypeid
from rooms 
where roomnumber not in 
(
  select roomnumber 
  from booking 
  where departure >= to_date(? /* desired arrival date */, 'yyyy-mm-dd')
  and arrival <= to_date(? /* desired departure date */, 'yyyy-mm-dd')
)
and roomtypeid = ? /* desired room type */
order by roomnumber;

【讨论】:

  • 当 OP 要求提供免费房间时,您正在提供已占用房间的列表(好吧,这只是一个问题或逻辑否定......)。但是你确实解决了重叠问题
  • 这有帮助!非常感谢!
【解决方案2】:

我认为唯一的问题是日期格式将所有日期字段转换为日期并检查相同。

【讨论】:

    【解决方案3】:

    它看起来像这样 -

    SELECT *
    FROM rooms r
    WHERE NOT EXISTS (SELECT 1
                      FROM booking b
                      WHERE (?arrival_date_parameter BETWEEN arrival AND departure
                         OR arrival BETWEEN ?arrival_date_parameter AND ?departure_date_parameter)
                        AND r.roomnumber = b.roomnumber)
      AND roomtypeid = ?
    ORDER BY roomnumber
    

    【讨论】:

    • 我会试试这个。但是 r.roomnumber 和 b.roomnumber 是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多