首先,请原谅我的英语很差。我正在试着选择所有还没有预订的房间。这个查询似乎大多数时候都有效,但有时它显示的是给定时间已经预订的房间。
//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列。
根据开始和结束时间的列类型,您的比较可能会失败,但是正如在注释中指出的那样,您比较时间的逻辑是错误的。
您需要比较开始时间和结束时间,反之亦然:
WHERE reservation.begintime <= '{$date} {$endtime}'
AND reservation.endtime >= '{$date} {$begintime}'
除此之外,我不知道数据来自哪里,但为了避免sql注入,你最好使用一个准备好的语句,而不是直接在sql语句中注入php变量。
检查是否重复预订的方法如下:
如果现有预订开始于B0(开始于0),结束于E0(结束于0),并且您想要检查的时间段是从B1到E1,那么您想要检查所有现有预订,其中:
(B0 < E1) && (B1 < E0)
这些是碰撞,重复预订。
正如上面@d'alar'cop所暗示的那样,您需要像这样更改查询:
WHERE reservation.begintime >= '{$date} {$begintime}'
AND reservation.endtime <= '{$date} {$endtime}'
您希望找到一个大于开始日期,小于结束日期的预订,而不是相反。
此外,您将希望使用组合的日期时间列,而不是使用单独的列。