mysql - 如何在两个不同的列中查找两个日期之间的数据?
问题描述
我正在从事酒店管理项目,关于房间可用性问题,我需要更多代码,这里是图片链接 [ 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 系统接受它。
任何人都可以帮我添加一些代码,以便可以拒绝房间。非常感谢提前
解决方案
我不确定你在问什么。可以通过以下方式选择不与相关日期重叠的预订:
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
推荐阅读
- django-templates - 对于 OpenEdX 中的新 XBlock,if-else 和 for 循环在 HTML 中不起作用
- python - Crypto.Signature.PKCS1_v1_5 和 Crypto.Signature.pkcs1_15 有什么区别?
- python - GZip 和输出文件
- reactjs - 为什么源荧光笔在 asciidoctor 中不起作用?
- dependency-injection - CDI 2.0(焊接):无法注入非 CDI 组件
- monitoring - 监控短期 SCDF 任务
- python - Urllib.request 和 BeautifulSoup
- javascript - 将组合添加到 tinymce 工具栏,选择一个选项会注入一些文本
- reactjs - 在material-ui中为mobileMenu添加徽章
- flutter - 颤振在2个标记之间绘制路线