【问题标题】:Skip rows in time range specified in table在表中指定的时间范围内跳过行
【发布时间】:2017-04-21 18:21:09
【问题描述】:

我有一个带有“睡眠阶段”的作业表,我不想返回介于 sleep_startsleep_end 之间的行。

CREATE TABLE `jobs` (
  `job_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `sleep_start` time DEFAULT NULL,
  `sleep_end` time DEFAULT NULL,
  PRIMARY KEY (`account_id`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

每个作业都有一个不应被调用的时间范围,该时间范围以00:00:00的时间格式指定

然后我想运行一个像

这样的查询
SELECT * FROM jobs WHERE TIME(NOW()) NOT BETWEEN sleep_start AND sleep_end

并且只获得不休眠的工作。

现在当sleep_startsleep_end 在同一天并且时间跨度不超过00:00:00 时,这似乎有效。发生这种情况时,总是会返回这些行。

如何更改查询以使其适用于所有场景?

【问题讨论】:

  • SELECT * FROM jobs WHERE NOT TIME(NOW()) BETWEEN sleep_start AND sleep_end
  • 跨越午夜会导致代码混乱;不能简单的表达。
  • 也许更改查询并坚持使用start 时间会更容易,但将sleep_end 更改为sleep_duration int,它以小时为单位保存睡眠时间,然后从时间构造一个日期今天,与 + 间隔 X 小时相同

标签: mysql time innodb between


【解决方案1】:

根据您对问题的描述,您的时间列代表一天中的时间,如果sleep_start < sleep_end 那么我们应该假设sleep_end 在第二天。

您只需要测试这两种情况。

SELECT * FROM jobs   
WHERE TIME(NOW()) NOT BETWEEN sleep_start AND sleep_end
AND NOT (sleep_start > sleep_end AND 
    (TIME(NOW()) >= sleep_start OR TIME(NOW()) <= sleep_end));

第一个检查(BETWEEN 子句)是sleep_start &lt;= sleep_end 的情况。但它不必明确检查,因为NOW() 永远不会在它们之间,除非它是真的。

后半部分确实包括对sleep_start &gt; sleep_end 的检查,如果是这种情况,它会检查NOW() 是在较晚时间之后还是在较早时间之前。

【讨论】:

  • 假设开始时间是 23:00,结束时间是 02:00,那么查询的后半部分将是 02:00-23:00,这不是预期的
  • 你是对的。在我的脑海中尝试这样做对我很有帮助!我将重写第二个查询条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
相关资源
最近更新 更多