假设我有一个名为 events
的表,其中包含列
INT id
DATETIME start_time
DATETIME end_time
如何找到从 start_time 到 end_time 的时间范围的任何部分落在特定小时范围内的所有行?
例如,我可能想要查找事件的某些部分发生在晚上 8 点至 10 点时间范围内的行。
类似
select * from events where (hour(start_time) IN (20, 21, 22)) or (hour(end_time) IN (20, 21, 22))
可以,但晚上 8 点之前开始并在晚上 11 点之后结束的事件除外。
最后,它必须跨越一天的界限,因此像 23-2(晚上 11 点 - 凌晨 2 点)这样的范围也应该有效。
不幸的是,我无法修改表的架构。
最佳答案
假设 start_time 和 end_time 字段是日期时间字段,则
SELECT *
FROM events
WHERE (start_time <= $event_end_time) AND (end_time >= $event_start_time)
这有点违反直觉,但如果你从时间轴上看:
A&B 是你的极限栅栏。 X&Y 是 start_time 和 end_time 字段:
A B
p = ----------- event falls outside the boundaries
X Y
A B
q = ----------- partial overlap
X Y
A B
r = ----------- partial overlap again
X Y
A B
s = ----------- full overlap
X Y
A B
t = ----------- outside boundaries
X Y
您对案例 Q、R 和 S 感兴趣。您会注意到,对于这 3 个案例,Y 始终 >= A,X 始终 <= B
关于mysql - 如何在 MySQL 中查找与一组小时重叠的事件范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7882362/