You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP+MySQL如何判断新增预约时间段是否与数据库已有时间段冲突

预约时间段冲突校验优化方案

判断两个时间段是否冲突不需要枚举所有冲突场景,反过来推导不冲突的条件更简单:两个时间段完全不重叠的情况只有两种,要么新预约的结束时间早于等于已有预约的开始时间,要么新预约的开始时间晚于等于已有预约的结束时间,除此之外所有情况都属于冲突。

你存储的是标准YYYY-mm-dd hh:mm:ss格式的datetime数据,转成时间戳比较即可,跨天场景不需要单独处理,datetime自带的日期信息会自动完成校验,完全匹配你给出的示例规则。

优化后的代码如下:

<?php
// 校验函数:返回true表示无冲突可预约,返回false表示冲突不可预约
function checkAvailability($newBookStart, $newBookEnd, $oldBookStart, $oldBookEnd)
{
    // 转时间戳比较避免字符串比较的异常问题
    $newStartTs = strtotime($newBookStart);
    $newEndTs = strtotime($newBookEnd);
    $oldStartTs = strtotime($oldBookStart);
    $oldEndTs = strtotime($oldBookEnd);
    
    // 对不冲突的两个条件取反,直接得到冲突判断结果
    if (!($newEndTs <= $oldStartTs || $newStartTs >= $oldEndTs)) {
        return false;
    }
    return true;
}

// 调用逻辑优化
$newBookStart = "2020-10-19 15:00:00";
$newBookEnd = "2020-10-19 17:00:00";
$isAvailable = true;

foreach ($oldBooks as $oldBook) {
    $oldBookStart = $oldBook['startDateTime'];
    $oldBookEnd = $oldBook['endDateTime'];
    if (!checkAvailability($newBookStart, $newBookEnd, $oldBookStart, $oldBookEnd)) {
        $isAvailable = false;
        break; // 检测到冲突直接终止循环,减少不必要运算
    }
}

if (!$isAvailable) {
    echo "<script>alert('抱歉,当前时间段不可预约')</script>";
    // 此处可补充终止提交的后续逻辑
}
?>

上述逻辑覆盖了所有冲突场景:包含新预约被老预约覆盖、老预约被新预约覆盖、两端边缘重叠、跨天重叠等所有情况,完全匹配你给出的示例校验规则,代码简洁不易漏判。

内容的提问来源于stack exchange,提问作者Eng Keat Ang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:36:05