纠正查询优化时间范围的MySQL结构?

时间:2012-03-30 05:11:05

标签: mysql sql

我有一个场景,我希望能够从MySQL表中选择行,但排除当前时间在时间​​范围内的行。

示例: 一排的“安静”时段是晚上10点到早上8:30。 如果当前服务器时间是在晚上10点之后或早上8:30之前,则我的SQL SELECT语句不应返回该行。

示例2 :“安静期”为NULL并被忽略。

示例3 :在上午9:53到9:55之间创建一个安静时段的新行。如果当前服务器时间在该2分钟窗口中,则SELECT不会返回该行。

我的问题: 您将在数据库中使用什么数据格式,以及如何编写查询?

我考虑了几种不同的方法(将start_time定义为一列,将持续时间定义为另一列,以秒为单位定义......或使用日期戳...或其他)。这些都不是理想的,需要大量的计算。

谢谢!

1 个答案:

答案 0 :(得分:2)

我会将开始日期和结束日期存储为MySQL本地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,并且可能也添加相关的INDEX。