【问题标题】:SQL query available rooms for bookingSQL查询可预订房间
【发布时间】:2019-12-06 22:17:46
【问题描述】:

我一直在尝试创建一个查询来检查两个日期之间的可用房间,但迄今为止没有成功。请在下面找到用于创建表格的 sql 代码。我真的很需要你的帮助。这样做是因为系统要我添加更多详细信息

CREATE TABLE rooms (
    id   NUMERIC(3) NOT NULL,
    type VARCHAR2(11) NOT NULL,
    CONSTRAINT pk_rooms PRIMARY KEY (id),
    CONSTRAINT fk_type
    );

INSERT INTO rooms VALUES (101, 'Excellent');
INSERT INTO rooms VALUES (102, 'Excellent');
INSERT INTO rooms VALUES (103, 'Excellent');
INSERT INTO rooms VALUES (104, 'Excellent');
INSERT INTO rooms VALUES (105, 'Excellent');
INSERT INTO rooms VALUES (106, 'Excellent');
INSERT INTO rooms VALUES (107, 'Excellent');
INSERT INTO rooms VALUES (108, 'Excellent');
INSERT INTO rooms VALUES (109, 'Excellent');
INSERT INTO rooms VALUES (110, 'Excellent');
INSERT INTO rooms VALUES (111, 'Excellent');
INSERT INTO rooms VALUES (112, 'Excellent');

CREATE TABLE bookings_roombookings (
book_id  VARCHAR(20) NOT NULL, 
room_id  NUMBER NOT NULL,  
fromdate DATE NOT NULL, 
todate   DATE NOT NULL, 
guest1   VARCHAR(40) NOT NULL, 
guest2   VARCHAR(40), 
guest3   VARCHAR(40), 
CONSTRAINT cpk PRIMARY KEY (book_id, room_id),  
CONSTRAINT fk_rid FOREIGN KEY (room_id) REFERENCES rooms(id));

INSERT INTO bookings_roombookings VALUES ( 
'DTR5000000', 320, 
'01-JUN-2020', '01-SEP-2020', 
'D.Trump', 'H.Clinton', 'S.Daniels');

INSERT INTO bookings_roombookings VALUES ( 
'DRI0000002', 102, 
'11-DEC-19', '01-SEP-20', 
'D.Ridley', NULL, NULL);

我的查询如下:

select r.id from rooms r
where  r.id not in
       ( select bkr.room_id from bookings_roombookings bkr
         where  (fromdate > '15-JUN-20') and (todate < '18-JUN-20') );

但这将返回 bkr 表的两行。我将不胜感激。

【问题讨论】:

  • 不要将日期存储为 varchar。将其存储为日期
  • 您在bookings_roombookings 中插入了320,但它在rooms 表中不存在。
  • 是的,数据比我最初插入的要多

标签: sql oracle date


【解决方案1】:

您可以从room 表开始,并使用带有相关子查询的not exists 条件来消除预订期与目标日期范围重叠的房间:

select r.* 
from rooms r 
where not exists (
    select 1
    from bookings_roombookings bkr
    where 
        bkr.room_id = r.id
        and bkr.fromdate <= date'2020-06-15'
        and bkr.todate >= date'2020-06-18'
)

注意:不要依赖从字符串到日期的隐式转换(如fromdate &gt; '15-JUN-20'),这取决于数据库和会话的 nls 设置;相反,您可以使用作为 ANSI SQL 标准的一部分并且 Oracle 支持的日期文字,例如 date'yyyy-mm-dd'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多