在表中指定的时间范围内跳过行
Posted
技术标签:
【中文标题】在表中指定的时间范围内跳过行【英文标题】:Skip rows in time range specified in table 【发布时间】: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_duration
int,它以小时为单位保存睡眠时间,然后从时间构造一个日期今天,与 + 间隔 X 小时相同
【参考方案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 <= sleep_end
的情况。但它不必明确检查,因为NOW()
永远不会在它们之间,除非它是真的。
后半部分确实包括对sleep_start > sleep_end
的检查,如果是这种情况,它会检查NOW()
是在较晚时间之后还是在较早时间之前。
【讨论】:
假设开始时间是 23:00,结束时间是 02:00,那么查询的后半部分将是 02:00-23:00,这不是预期的 你是对的。在我的脑海中尝试这样做对我很有帮助!我将重写第二个查询条件。以上是关于在表中指定的时间范围内跳过行的主要内容,如果未能解决你的问题,请参考以下文章
程序人生 - 2021浙A区域号牌限行规定(限行时间+限行路段+限行范围图)