首页 > 解决方案 > 如何在两个不同的列中查找两个日期之间的数据?

问题描述

我正在从事酒店管理项目,关于房间可用性问题,我需要更多代码,这里是图片链接 [ https://i.stack.imgur.com/6Qlbl.png]。通过使用以下代码

SELECT b.check_in, b.check_out, r.room_no, r.room_id 
FROM room r JOIN booking b 
ON r.room_id = b.room_id  
WHERE 
  r.room_id = $room_no 
  AND b.check_in <= '$check_in_date' AND b.check_out >= '$check_out_date'

到目前为止,它会检查两个日期之间的可用性,假设在 2019 年 8 月 15 日至 2019 年 8 月 20 日期间预订房间,一旦预订,系统就会拒绝。但是一旦预订,假设 18/8/2019 - 22/8/2019 系统接受它。

任何人都可以帮我添加一些代码,以便可以拒绝房间。非常感谢提前

标签: mysqlselect

解决方案


我不确定你在问什么。可以通过以下方式选择不与相关日期重叠的预订:

SELECT room_id FROM booking
WHERE '$checkin_date' >= check_out OR '$checkout_date' <= check_in

因此,可以通过以下方式选择因现有预订而无法使用的房间:

SELECT room_id FROM booking
WHERE '$checkin_date' <= check_out AND '$checkout_date' >= check_in

因此,如果您正在寻找一个由于预订日期重叠而导致新预订被拒绝的预订,那么您应该将您的 SQL 修改为:

SELECT b.check_in, b.check_out, r.room_no, r.room_id 
FROM room r JOIN booking b 
ON r.room_id = b.room_id  
WHERE 
  r.room_id = $room_no 
  AND '$checkin_date' <= b.check_out AND '$checkout_date' >= b.check_in

如果您正在根据已预订的房间寻找两个日期之间可供预订的所有房间,那么:

SELECT check_in, check_out, room_no, room_id FROM room WHERE room_id NOT IN (
    SELECT room_id FROM booking
        WHERE '$checkin_date' <= check_out AND '$checkout_date' >= check_in
)

或者对于那些喜欢使用连接的人,以下应该返回相同的结果:

SELECT r.check_in, r.check_out, r.room_no, r.room_id FROM room r LEFT JOIN (
    SELECT room_id FROM booking
        WHERE '$checkin_date' <= check_out AND '$checkout_date' >= check_in
) sq ON r.room_id = sq.room_id
WHERE sq.room_id is NULL

推荐阅读