跨天时段SQL时间查询返回空值的解决方案求助
解决跨天班次时间查询的问题
这个问题我之前也碰到过,核心原因是跨天班次的时间范围没法用普通的BETWEEN直接判断,咱们一步步来拆解和解决:
问题根源
你看第三班的时间范围是20:00:01到03:00:00,这里start_time(20:00:01)是大于end_time(03:00:00)的。当你用'22:02:22' BETWEEN start_time AND end_time时,数据库会默认判断22:02:22 >= 20:00:01 AND 22:02:22 <= 03:00:00,后者显然不成立,所以返回空结果。
解决方案
我们需要把班次分成非跨天和跨天两种情况,分别写查询条件:
SELECT * FROM shift_time WHERE -- 处理非跨天的班次:时间在start_time和end_time之间 (start_time <= end_time AND '22:02:22' BETWEEN start_time AND end_time) OR -- 处理跨天的班次:时间要么在当天的后半段(>=start_time),要么在次日凌晨(<=end_time) (start_time > end_time AND ('22:02:22' >= start_time OR '22:02:22' <= end_time));
验证效果
- 查询
22:02:22时,会匹配第三班(no_shift=3),因为它属于跨天班次,且22:02:22 >= 20:00:01; - 查询
02:30:00时,同样会匹配第三班,因为02:30:00 <= 03:00:00; - 非跨天的班次(比如第一班、第二班)依然可以用原来的逻辑正常匹配。
你可以把查询的时间参数换成变量或者动态值,这个逻辑都适用哦。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

