假设我有下表:
id | value | start_time | stop_time
-----------------------------------------------------------------
1 | value1 | 06:00:00 | 11:00:00
2 | value2 | 12:00:00 | 13:00:00
我需要选择时间范围与05:00-11:30重叠的记录。这意味着要返回的记录是第1行。
我尝试使用这样的查询,但是当给定的时间范围超过午夜时它会失败。如果没有涉及约会,也许不可能做到这一点。
SELECT * FROM table WHERE
(
(start_time >= '05:00:00' AND stop_time <= '11:30:00') ||
(start_time >= '05:00:00' AND start_time <= '05:00:00') ||
(start_time <= '05:00:00' AND stop_time >= '11:30:00') ||
(stop_time >= '11:30:00' AND stop_time <= '05:00:00')
)
我正在考虑枚举给定时间范围的所有分钟并使用BETWEEN
进行过滤,但可能有更好的解决方案。
答案 0 :(得分:0)
戴夫,
我能看到的最简单的方法是为start_time
和'stop_time`字段使用'TIME'类型。
然后你可以这样选择:
SELECT * FROM `YOUR_TABLE_NAME_HERE` WHERE `start_time` > '05:00:00' AND `stop_time` < '11:30:00'
答案 1 :(得分:0)
每个范围都需要用条件表示,如下所示:
IF(start_time < stop_time, start_time >= '05:00:00' AND stop_time <= '11:30:00', start_time <= '05:00:00' AND stop_time >= '11:30:00')