我正在为酒店预订系统制作网站。我需要有关查询的帮助,我正在搜索帖子,但我找不到适用于我的解决方案。 在我的数据库中,我有桌面预订,当用户输入签入和签出指定的房间时,需要通过查询检查和签出日期。这是我的疑问:
SELECT * FROM booking WHERE room='$room' and ((checkin>='$cIN' and checkout<='$cOUT' )or(checkin<='$cIN' and checkout>='$cOUT'))
&#39; $ CIN&#39;和&#39; $ cOUT&#39;是用户输入和退房的输入。 我的查询在某些情况下工作,比如说房间是从2017年3月15日到2017年3月20日预订,当新用户输入13/03/2017到2017年3月17日然后查询不返回任何结果,用户可以预订同一个房间。因此,在这种情况下,我们在同一时间间隔内的一个房间中有2个用户。我需要限制这种保留。提前谢谢。
答案 0 :(得分:0)
要查找重叠,我们需要在现有结帐之前搜索请求结账的项目,并且在现有结账时请求结账。
-- Return existing bookings that overlap the requested date range
SELECT *
FROM booking
WHERE room = '$room'
and checkin <= '$cOUT' and checkout >= '$cIN'
比你想象的简单:)
请注意,此查询不允许新预订在之前的预订签出的同时签入。如果您的签入/退出字段没有存储时间,那么您需要更改此逻辑以使用&lt;,&gt;而不是&lt; =,&gt; =
答案 1 :(得分:0)
这是我的逻辑,查询是检查数据库中签入日期和签出日期之间的签入日期,还检查数据库中签入日期和签出日期之间的签出日期。如果有数据库行,则您的签入或签出日期不可用。
SELECT * FROM reservasi WHERE (
'$checkin' BETWEEN checkin_date AND checkout_date
OR '$checkout' BETWEEN checkin_date AND checkout_date)
-->num_rows
此外,如果一个房间类别有很多房间,请检查第一个房间的类别ID。 如果没有数据库行,则空间不可用。
SELECT * FROM room WHERE class_id='$class_id' AND status='available'