我有一个场景,我希望能够从MySQL表中选择行,但排除当前时间在时间范围内的行。
示例: 一排的“安静”时段是晚上10点到早上8:30。 如果当前服务器时间是在晚上10点之后或早上8:30之前,则我的SQL SELECT语句不应返回该行。
示例2 :“安静期”为NULL并被忽略。
示例3 :在上午9:53到9:55之间创建一个安静时段的新行。如果当前服务器时间在该2分钟窗口中,则SELECT不会返回该行。
我的问题: 您将在数据库中使用什么数据格式,以及如何编写查询?
我考虑了几种不同的方法(将start_time定义为一列,将持续时间定义为另一列,以秒为单位定义......或使用日期戳...或其他)。这些都不是理想的,需要大量的计算。
谢谢!
答案 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。