MySQL中如何判断时间值是否落在跨天的两个时间区间内
解决跨天时间段匹配的SQL方案
针对你描述的场景(无日期字段、时间段跨度不超过24小时,存在跨午夜的时间段),可以通过分情况判断的SQL语句直接实现需求,无需存储过程:
核心逻辑是区分两种时间段类型:
- 非跨天时间段:
end_time >= start_time,此时目标时间需落在[start_time, end_time)区间内 - 跨天时间段:
end_time < start_time,此时目标时间只需落在[start_time, 24:00)或[00:00, end_time)任一区间内
对应的SQL语句如下(以目标时间22:00为例):
SELECT * FROM your_table WHERE -- 匹配非跨天的有效时间段 (start_time <= end_time AND start_time <= '22:00' AND '22:00' < end_time) OR -- 匹配跨天的有效时间段 (start_time > end_time AND ('22:00' >= start_time OR '22:00' < end_time));
效果验证
- 对于id=1的记录(15:00-23:00):属于非跨天时间段,
22:00满足15:00 <= 22:00 < 23:00,会被匹配 - 对于id=2的记录(15:30-01:00):属于跨天时间段,
22:00 >= 15:30,满足条件,会被匹配
如果需要动态传入目标时间,只需将语句中的'22:00'替换为对应的参数即可(不同数据库的参数语法略有差异,比如MySQL用@target_time,PostgreSQL用$1)。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

