检查房间是否空闲(教室预订)



首先,请原谅我的英语很差。我正在试着选择所有还没有预订的房间。这个查询似乎大多数时候都有效,但有时它显示的是给定时间已经预订的房间。

//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}'

您希望找到一个大于开始日期,小于结束日期的预订,而不是相反。

此外,您将希望使用组合的日期时间列,而不是使用单独的列。

最新更新