我有一个场景,我希望能够从 MySQL 表中选择行,但排除当前时间在时间范围内的行。
示例: 一排的“安静”时段是晚上 10 点至上午 8:30。 如果当前服务器时间在晚上 10 点之后或上午 8:30 之前,我的 SQL SELECT 语句不应返回该行。
示例 2:“安静期”为 NULL 并被忽略。
示例 3:创建一个新行,其中包含从上午 9:53 到上午 9:55 的安静期。如果当前服务器时间在该 2 分钟窗口内,则 SELECT 不会返回该行。
我的问题: 您将在数据库中使用什么数据格式,以及如何编写查询?
我考虑了几种不同的方法(将 start_time 定义为一列,将持续时间定义为另一列,以秒为单位定义......或使用日期戳......或其他)。它们看起来都不理想并且需要大量计算。
谢谢!
最佳答案
我会将开始日期和结束日期存储为 MySQL native TIME字段。 您需要将跨越午夜的范围视为两个单独的范围,但您可以像这样查询表,以查找所有当前的安静时段
SELECT DISTINCT name FROM `quiet_periods`
WHERE start_time<=CURTIME() AND CURTIME()<=end_time
或者查找所有非事件的安静时段
SELECT name FROM quiet_periods WHERE name NOT IN (
SELECT name FROM `quiet_periods`
WHERE start_time<=CURTIME() AND CURTIME()<=end_time
)
样本数据如下
id -- name -- start_time -- end_time
1 -- late_night -- 00:00:00 -- 08:30:00
2 -- late_night -- 22:00:00 -- 23:59:59
3 -- null_period -- NULL -- NULL
4 -- nearly_10am -- 09:53:00 -- 09:55:00
晚上 11 点将会返回
null_period
nearly_10am
来自第二个查询。
根据性能和您拥有的行数,您可能希望将第二个查询重构为 JOIN,并且可能还添加相关的索引。
关于mysql - 用于查询优化的时间范围的 MySQL 结构是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9937307/