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

Php 如何检查在时间范围内是否存在预订?,php,mysql,datetime,pdo,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 WHER

我正在开发一个会议室预订系统,我很难确定一个房间是否在设定的时间范围内预订,我使用当前的日期格式,并在表中将类型设置为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;
    }
}
在sql查询中有什么方法可以做到这一点吗


示例:A房间是在2016-03-31 15:00:00和2016-03-31 17:30:00之间预订的,用户然后尝试为A房间创建2016-03-31 16:30:00-2016-03-31 17:00:00的新预订,thsi应返回1条记录,因为有预订

在sql查询中使用中间值怎么样?您需要设置要检查的日期/时间参数,在给定示例中,这些参数将是第二个用户请求的日期/时间

$firstDate = //start of time period you are checking;
$lastDate = //end of time period you are checking;
 $Q->bindParam(':firstDate ', $firstDate );
 $Q->bindParam(':lastDate ', $lastDate );

 $sql = "SELECT * FROM bookings WHERE :date_start BETWEEN :firstDate AND :lastDate  AND room_no = :roomNo";
如果在给定的时间范围内未预订房间,则这将为您提供零行:span:dateStart-:dateEnd。 :dateStart-BETWEEN-date\u-start和date\u-end将检查是否在开始时间预订,:dateEnd-BETWEEN-date\u-start和date\u-end将检查是否在结束时间预订,最后一个日期\u-start-BETWEEN:dateStart和:dateEnd也很重要,例如,它检查房间是否在较短的时间内预订

编辑:或次,无和


EDIT2:要排除开始和结束时间,您必须展开BETWEEN关键字并使关系仅为a,房间从日期和时间a到日期和时间B。因此,如果新时间范围的开始或结束时间介于a和B之间,则将采用该关系。这就是您在SQL中需要的吗?@Renan这里有一个例子:A房间在2016-03-31 15:00:00到2016-03-31 17:30:00之间预订,用户然后尝试为A房间创建2016-03-31 16:30:00-2016-03-31 17:00:00的新预订,thsi应该返回1条记录,因为有预订请参见我的更新答案。如下图所示:从预订日期开始的位置选择*BETWEEN:dateStart和date\u end BETWEEN:dateEnd和room\u no=:roomNoI运行查询时出错:1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在'14:00:00和2016-03-31 17:00:00和room_no=1 LIMIT 0附近使用的正确语法,30'在第1行,查询:从预订中选择*,其中日期从2016-03-31 14:00:00到2016-03-31 17:00:00之间开始,房间号=1看起来好像在开始日期前缺少冒号-应该是参数:日期开始日期,我想我没有引用日期:dateStart应该是我的列名还是实际日期?:dateStart是变量$dateStart,date\u start是您的列。在你的问题中,我只使用了和你相同的名字sheme,如果预订在今天17:00结束,我想预订一个从17:00到18:00的会议怎么办?事实上,它会返回预订的房间。你可以和我交换关于如何避免它的想法吗?ie从结束日期中删除1分钟,并将其显示为结束日期+1分钟?
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
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