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
相关产品推荐
相关产品推荐

