2012-03-30 58 views
0

我有一个场景,我希望能够从MySQL表中选择行,但排除当前时间在一定时间范围内的行。更正查询优化时间范围的MySQL结构?

示例: 一行的“安静”期限为晚上10点至上午8点30分。 如果当前服务器时间晚上10点或上午8点30分之前,我的SQL SELECT语句不应返回该行。

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

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

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

我想过几种不同的方法(将start_time定义为一列和另一个持续时间,以秒为单位定义......或使用日期戳......或其他)。没有一个看起来很理想,需要大量的计算。

谢谢!

+0

你只需要每行的时间或者你还需要日期吗? – liquorvicar 2012-03-30 06:07:02

+0

我不需要返回。我只是试图根据一天的时间进行过滤。我不在乎约会。与上面的示例一样:我想排除当前服务器时间在指定的“安静窗口”内的行。 – 2012-03-30 16:43:55

回答

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。

+0

做得很好!跨越午夜是我正在考虑的问题,我希望可以在不添加第二张桌子并加入JOIN的情况下完成,但是哦= P – 2012-03-31 18:12:18