MySQL时间范围查询:起始时间可大于结束时间的场景处理
MySQL 按星期匹配跨天时间区间的查询解决方案
针对你的page_data表需求,正确的查询需要区分三种时间区间场景,以下是覆盖所有情况的SQL语句:
SELECT * FROM page_data WHERE field_value = 'Friday' AND ( -- 场景1:全天有效 (start_time = '00:00:00' AND end_time = '00:00:00') -- 场景2:正常时间区间(当天start到当天end) OR (start_time < end_time AND TIME(NOW()) BETWEEN start_time AND end_time) -- 场景3:跨天区间(当天start到次日end) OR (start_time > end_time AND (TIME(NOW()) >= start_time OR TIME(NOW()) <= end_time)) );
逻辑说明
- 场景1:直接判断start和end均为
00:00:00,这类记录全天有效,无需额外时间校验。 - 场景2:当
start_time < end_time时,时间区间是当天的起始到结束,直接用BETWEEN判断当前时间是否在区间内即可。 - 场景3:当
start_time > end_time时,代表区间跨天(比如17:00到次日08:00),此时只要当前时间大于等于start_time(当天17点之后),或者小于等于end_time(次日08点之前),就符合条件。
原语句问题分析
你之前的查询错误地使用了'10:00:00' between end_time and start_time,这会把08:00到17:00的区间也纳入判断,导致10:00这种不在跨天区间内的时间也被错误匹配。正确的逻辑应该是针对跨天场景拆分两个独立的时间判断,而不是反向使用BETWEEN。
内容的提问来源于stack exchange,提问作者imvain2
相关产品推荐
相关产品推荐

