mysql - 如何在 MySQL 中查找与一组小时重叠的事件范围?

标签 mysql datetime

假设我有一个名为 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/

相关文章:

python - pandas 重新采样改变索引的数值

C#:实现格式良好的时间字符串的最佳方法?

java - 将一天中的秒数解析为日期字符串的一部分

c++ - 将日期、时间和 UTC 偏移值转换为自 unix 纪元以来的毫秒数?

mysql - SHA1 + SQL 中的盐散列

MYSQL名称字段不采用其他语言的名称

javascript - 在 PHP 上更新 MySQL 变量而不刷新

php - 将选定的值保存在数据库中作为 id

php - 提交按钮在 isset 中不起作用

python - 如何使用 Tastypie 在 Python (Django) 中基于 DateTimeField 范围过滤对象