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

Posted

技术标签:

【中文标题】在表中指定的时间范围内跳过行【英文标题】: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 小时相同 【参考方案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,这不是预期的 你是对的。在我的脑海中尝试这样做对我很有帮助!我将重写第二个查询条件。

以上是关于在表中指定的时间范围内跳过行的主要内容,如果未能解决你的问题,请参考以下文章

在日期字段上进行时间范围搜索的休眠条件

程序人生 - 2021浙A区域号牌限行规定(限行时间+限行路段+限行范围图)

角度指令可以将参数传递给指令属性中指定的表达式中的函数吗?

块范围链接 C 标准

用nodejs sequelize中指定的字段隐藏db中的一个结果。

在multiValued字段中搜索日期范围内的日期