如何select在一个时间范围内和不在一个时间范围内
How to select within a time range and not within a time range
我有员工。现在是 9:30 上午。我想 select 现在正在工作的每个人。然后在单独的 sql 声明中,我想 select 现在没有工作的每个人。我怎样才能做到这一点?我无法理解逻辑。我故意使用 time
字段而不是 datetime
。
我的 table 样本数据
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');
正在工作的人:
姓名
鲍勃
杰克
詹姆斯
没有工作的人:
姓名
比尔
莎拉
结婚
我无法理解它,我对正在工作的人的尝试是错误的但是...:[=15=]
SELECT name
FROM shifts
WHERE start_time <= '09:30:00' AND
end_time >= '09:30:00';
您可以select现在工作的每个人使用:
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))
);
我有员工。现在是 9:30 上午。我想 select 现在正在工作的每个人。然后在单独的 sql 声明中,我想 select 现在没有工作的每个人。我怎样才能做到这一点?我无法理解逻辑。我故意使用 time
字段而不是 datetime
。
我的 table 样本数据
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');
正在工作的人:
姓名 |
---|
鲍勃 |
杰克 |
詹姆斯 |
没有工作的人:
姓名 |
---|
比尔 |
莎拉 |
结婚 |
我无法理解它,我对正在工作的人的尝试是错误的但是...:[=15=]
SELECT name
FROM shifts
WHERE start_time <= '09:30:00' AND
end_time >= '09:30:00';
您可以select现在工作的每个人使用:
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))
);