跳过表中指定的时间范围内的行

时间:2017-04-21 18:21:09

标签: mysql time innodb between

我有一个带有'睡眠阶段'的作业表,我不想返回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时,这似乎正常。发生这种情况时,总会返回这些行。

如何更改查询以使其在所有方案中都有效?

1 个答案:

答案 0 :(得分:0)

根据您对问题的描述,您的时间列代表一天中的时间,如果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 <= sleep_end的情况。但它没有必要明确检查,因为NOW()永远不会介于它们之间,除非它是真的。

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