在房间预订方面,我在酒店预订中有此数据库结构
下面是我的桌子 room
room_num roomtype
101 Single
102 Single
103 Single
111 Deluxe
112 Deluxe
113 Deluxe
114 Deluxe
115 Deluxe
116 Deluxe
121 Superior
122 Superior
Run Code Online (Sandbox Code Playgroud)
下表room_booked是预订房间数的记录
dor是入住日期,dco是日期结帐
room_num dor dco
111 2014-06-01 2014-06-06
112 2014-06-01 2014-06-06
113 2014-06-01 2014-06-06
114 2014-06-01 2014-06-06
115 2014-06-01 2014-06-06
116 2014-06-01 2014-06-06
112 2014-05-18 2014-05-21
113 2014-08-01 2014-08-04
Run Code Online (Sandbox Code Playgroud)
在这种情况下,所有豪华房都从预订2014-06-01到2014-06-06。然后,我通过使用以下MySQL代码选择了2014年6月1日至2014年6月6日可用的豪华间
SELECT
room.room_num
FROM
room
LEFT JOIN
room_booked ON room_booked.room_num = room.room_num
WHERE
(
(
dor IS NULL AND dco IS NULL
)
OR (
-- wished booking date is before DOR
'2014-06-06' < dor
-- OR wished booking date is after DCO
OR '2014-06-01' >= dco
)
)
-- room type
AND roomtype = 'Deluxe'
Run Code Online (Sandbox Code Playgroud)
但是显示的是豪华房号。在上面所选日期范围之前和之后预订的112和113,而不是0或已满。有解决此代码的解决方案吗?
我认为您必须同时检查两个日期才能入住和退房:
SELECT
room.room_num
FROM
room
WHERE
roomtype = 'Deluxe' AND
room.room_num not in
(
SELECT
room_booked.room_num
FROM
room_booked
WHERE
(room_booked.dor<='2014-06-1' and room_booked.dco>='2014-06-1')
OR
(room_booked.dor<'2014-06-06' and room_booked.dco>='2014-06-06')
OR
(room_booked.dor>='2014-06-01' and room_booked.dco<'2014-06-06')
)
Run Code Online (Sandbox Code Playgroud)
重新编辑答案并创建一个sqlfiddle进行测试