预订房间的 SQL 查询

6
我在编写SQL以从表中获取可用房间时遇到了问题。我的表结构如下所示。
表:booking
booking_id    |    room_id   |    start_datetime  |   end_datetime    |   customer_id
-------------------------------------------------------------------------------------
001           |     1        |  12-09-2012 2:35pm | 14-09-2012 9:00am |    23
002           |     2        | 10-09-2012 1:00am  | 20-09-2012 9:00am |    20
003           |     4        |  09-09-2012 1:35pm | 21-09-2012 9:00am |    43
004           |     1        |  22-09-2012 2:35pm | 24-09-2012 9:00am |    9
005           |     3        |  12-09-2012 9:00am | 13-09-2012 9:00am |    53
006           |     6        |  15-09-2012 9:00am | 19-09-2012 9:00am |    27

表:房间
包含关于房间的详细信息,主键是room_id,该表有10个房间,编号从1到10。
我的问题是,我想知道哪些房间在2012年9月14日下午6:00至2012年9月21日上午9:00之间可用,这意味着我应该只得到房间号为1、3、5、7、8、9、10的结果。
有人可以帮我编写SQL以从上述表结构中获取可用房间吗?我正在使用mysql作为数据库引擎。提前谢谢。
1个回答

12

这应该可以解决问题;如果有任何预订不在我们想要的预订结束之前或开始之后,那么房间将被视为已被占用。

SELECT r.room_id
FROM rooms r
WHERE r.room_id NOT IN (
    SELECT b.room_id FROM bookings b
    WHERE NOT (b.end_datetime   < '2012-09-14T18:00'
               OR
               b.start_datetime > '2012-09-21T09:00'))
ORDER BY r.room_id;

点击此处获取SQLFiddle.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接