【发布时间】:2017-04-21 18:21:09
【问题描述】:
我有一个带有“睡眠阶段”的作业表,我不想返回介于 sleep_start 和 sleep_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_start 和sleep_end 在同一天并且时间跨度不超过00:00:00 时,这似乎有效。发生这种情况时,总是会返回这些行。
如何更改查询以使其适用于所有场景?
【问题讨论】:
-
SELECT * FROM jobs WHERE NOT TIME(NOW()) BETWEEN sleep_start AND sleep_end -
跨越午夜会导致代码混乱;不能简单的表达。
-
也许更改查询并坚持使用
start时间会更容易,但将sleep_end更改为sleep_durationint,它以小时为单位保存睡眠时间,然后从时间构造一个日期今天,与 + 间隔 X 小时相同