我有一个带有'睡眠阶段'的作业表,我不想返回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
时,这似乎正常。发生这种情况时,总会返回这些行。
如何更改查询以使其在所有方案中都有效?
答案 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()
是在更晚的时间之后还是在更早的时间之前。