mysql - 用于查询优化的时间范围的 MySQL 结构是否正确?

标签 mysql sql

我有一个场景,我希望能够从 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/

相关文章:

mysql - 良好的登录系统数据库设计的唯一约束 ID?

sql - sql server 2008中十进制到十六进制的转换

MySQL查询以获取多个表上一列的第一个唯一值

java - 减去两个 java.sql.timestamp 给出错误的年份

php - 通过优先级在单个 Laravel 查询中进行多选择查询

mysql - Flutter/Dart 只提取日期和时间?

php - 向所有 json_encode() 数据添加一个通用词

php - 选取所有fieldone不等于null的字段 + Propel

mysql - 在 GROUP BY 子句中返回空行

php - sql 查询对一个查询中多个定义的列进行计数