首先,请原谅我英语不好。我试图选择所有尚未预订的房间。查询似乎在大多数时间都有效,但有时会显示已在预定时间内预订的房间。
//Example input:
//$date = 2014-06-04;
//$begintime = 09:30;
//$endtime = 12:00;
$query = $mysqli->query("
SELECT *
FROM room
WHERE room.id NOT IN (
SELECT room_id
FROM reservation
WHERE reservation.begintime <= '{$date} {$begintime}'
AND reservation.endtime >= '{$date} {$endtime}'
)
");
我做错了什么?它让我发疯,似乎无法解决这个问题。
提前致谢!
修改
开始和结束时间都是DATETIME列。
答案 0 :(得分:3)
根据开始和结束时间的列类型,您的比较可能会失败,但正如评论中所示,您比较时间的逻辑是错误的。
您需要将开始时间与结束时间进行比较,反之亦然:
WHERE reservation.begintime <= '{$date} {$endtime}'
AND reservation.endtime >= '{$date} {$begintime}'
除此之外,我不知道数据的来源,但为了避免sql注入,你最好使用预备语句而不是直接在sql语句中注入php变量。
答案 1 :(得分:0)
检查双重预订的方法是:
如果现有的重新开始于B0(开始0)并结束于E0(结束0),并且您要检查的时间段是从B1到E1,那么您要检查所有现有的保留位置:
(B0 < E1) && (B1 < E0)
这些是碰撞,双重预订。
答案 2 :(得分:-1)
正如@ d&#39;警告警告上面提到的那样,你需要改变你的查询:
WHERE reservation.begintime >= '{$date} {$begintime}'
AND reservation.endtime <= '{$date} {$endtime}'
您希望找到一个大于开始日期且小于结束日期的预订,反之亦然。
此外,您不想使用单独的列,而是使用组合的日期时间列。