如何检查时间范围内是否存在预订?

Kri*_*and 2 php mysql datetime pdo

我正在会议室预订系统上工作,无法确定会议室是否在设定的时间范围内占用,我在使用当前格式的日期并将DATETIME表中的类型设置为:YYYY-MM-DD HH:II:SS

这是我当前的代码:

//Function to check if a booking exists:
function bookingExist($DateStart, $DateEnd, $RoomNo) {
    global $DB;

    $sql = "SELECT * FROM bookings WHERE date_start = :dateStart AND date_end = :dateEnd AND room_no = :roomNo";
    $Q = $DB->prepare($sql);
    $Q->bindParam(':dateStart', $DateStart);
    $Q->bindParam(':dateEnd', $DateEnd);
    $Q->bindParam(':roomNo', $RoomNo);
    $Q->execute();

    if ($Q->rowCount()) {
        //A record exists...
        return true;
    } else {
        //no record exists
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以在sql查询中执行此操作?

例如:A室在2016-03-31 15:00:00到2016-03-31 17:30:00之间预订-2016-03-31 17:00:00并且此应该返回1记录,因为有预订

Fab*_* N. 5

SELECT *
FROM bookings
WHERE
  (
    :dateStart BETWEEN date_start AND date_end
    OR :dateEnd BETWEEN date_start AND date_end
    OR date_start BETWEEN :dateStart AND :dateEnd
  )
  AND room_no = :roomNo
Run Code Online (Sandbox Code Playgroud)

如果没有在给定的时间跨度内预定房间,则将为您提供零行:dateStart-:dateEnd。 :dateStart BETWEEN date_start AND date_end将检查开始时是否已经预订了房间,:dateEnd BETWEEN date_start AND date_end将检查在结束时间是否已预订了房间,最后一个date_start BETWEEN :dateStart AND :dateEnd也很重要,它将检查房间是否在两者之间预定(例如,较短的时间)

编辑:或时间,没有与;)

EDIT2:要排除开始时间和结束时间,您必须扩展BETWEEN关键字并使关系仅是<

SELECT *
FROM bookings
WHERE
  (
    (date_start < :dateStart AND :dateStart < date_end)
    OR (date_start < :dateEnd AND :dateEnd < date_end)
    OR (:dateStart < date_start AND date_start < :dateEnd)
  )
  AND room_no = :roomNo
Run Code Online (Sandbox Code Playgroud)