PHP执行SQL按时间条件查询班次数据返回0结果问题排查
问题根因
你目前的查询逻辑只适配了非跨天班次的判断,对end_time为00:00的跨天班次(也就是你的shift4,19:00到次日00:00)完全不生效:
- 比如当前时间为21:00,满足
start_time <= '21:00',但end_time > '21:00'的判断中,end_time的值是00:00,字符串比较下'00:00' > '21:00'结果为false,自然查不到对应班次。
修复方案
把SQL的判断逻辑拆分为跨天、非跨天两种场景分别处理即可,修改后的代码如下:
include 'config.php'; $create_time = date('H:i'); // 新增跨天班次判断逻辑,同时改用预处理语句避免SQL注入风险 $stmt = $conn->prepare(" SELECT * FROM shift_times WHERE -- 非跨天班次判断 (end_time > start_time AND start_time <= ? AND end_time > ?) OR -- 跨天班次判断 (end_time < start_time AND (start_time <= ? OR end_time > ?)) "); // 绑定参数 $stmt->bind_param("ssss", $create_time, $create_time, $create_time, $create_time); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo $row["shift_title"]; } } else { echo "0 results"; } $stmt->close(); $conn->close();
验证覆盖场景
修改后可以覆盖所有班次的匹配逻辑:
- 00:00~08:30:匹配shift1
- 08:30~12:00:匹配shift2
- 12:00~19:30:匹配shift3
- 19:00~次日00:00:匹配shift4
- 边界时间如08:30、12:00等也会匹配到正确的后续班次
内容的提问来源于stack exchange,提问作者Walrus
相关产品推荐
相关产品推荐

