如何在一个时间范围内而不是在一个时间范围内选择

Posted

技术标签:

【中文标题】如何在一个时间范围内而不是在一个时间范围内选择【英文标题】:How to select within a time range and not within a time range 【发布时间】:2021-06-23 01:04:45 【问题描述】:

我有员工。现在是上午 9 点 30 分。我想选择现在正在工作的每个人。然后在单独的 sql 语句中,我想选择现在不工作的每个人。我怎样才能做到这一点?我很难理解逻辑。我故意使用了time 字段而不是datetime

我的带有样本数据的表格

CREATE TABLE shifts (

    id                      int unsigned
                            AUTO_INCREMENT
                            PRIMARY KEY,

    name                    varchar(64)
                            NOT NULL,

    start_time              time
                            NOT NULL,

    end_time                time
                            NOT NULL
);

INSERT INTO shifts (id, name, start_time, end_time) VALUES
(1, 'Bob', '09:00:00', '17:00:00'),
(2, 'Jack', '09:30:00', '14:00:00'),
(3, 'Bill', '15:00:00', '03:00:00'),
(4, 'James', '23:30:00', '10:00:00'),
(5, 'Sarah', '14:30:00', '21:00:00'),
(6, 'Marry', '03:00:00', '09:30:00');

工作人员:

name
Bob
Jack
James

不工作的人:

name
Bill
Sarah
Marry

我无法理解它,我对正在工作的人的尝试是错误的,但是......:

SELECT name
FROM shifts
WHERE start_time <= '09:30:00' AND
end_time >= '09:30:00';

【问题讨论】:

【参考方案1】:

您可以选择正在使用的每个人:

select s.*
from shifts s
where (start_time < end_time and '09:30:00' >= start_time and '09:30:00' < end_time) or
      (start_time > end_time and ('09:30:00' >= start_time or '09:30:00' < end_time));

对于不工作的员工,您使用类似的逻辑。最简单的方法是:

select s.*
from shifts s
where not ((start_time < end_time and '09:30:00' >= start_time and '09:30:00' < end_time) or
           (start_time > end_time and ('09:30:00' >= start_time or '09:30:00' < end_time))
          );



  

【讨论】:

你能告诉我如何让没有工作的员工吗?那是我遇到最大困难的一个

以上是关于如何在一个时间范围内而不是在一个时间范围内选择的主要内容,如果未能解决你的问题,请参考以下文章

在容器内移动页面控件

使谷歌地图标记在区域/区域内可拖动?

TCP socket编程中如何让内核在(1024,5000)范围内选择一个端口号

TCP socket编程中如何让内核在(1024,5000)范围内选择一个端口号

如何检查我在使用 datePickerView 选择后选择的时间是不是在 Swift 的范围内(12:00-14:30)?我不知道如何开始

在一个范围内选择最大和最小日期时间