Sql 如何找到给定开始和结束时间的可用工人?
我正试图找到一种方法来找到在一定时间范围内可以工作的员工 下面是我的简单表格的外观:Sql 如何找到给定开始和结束时间的可用工人?,sql,postgresql,Sql,Postgresql,我正试图找到一种方法来找到在一定时间范围内可以工作的员工 下面是我的简单表格的外观: create table work_hours ( worker_id bigint, day int check( day > 0 and day < 8), starts_at time, ends_at time ) 我如何找到可能在12:00到15:30之间工作的工人 我尝试在开始时使用“介于”操作符,但如何检查范围,因为工作人员可能在09:00和17:00之间工作,这是我
create table work_hours (
worker_id bigint,
day int check( day > 0 and day < 8),
starts_at time,
ends_at time
)
我如何找到可能在12:00到15:30之间工作的工人
我尝试在开始时使用“介于”操作符,但如何检查范围,因为工作人员可能在09:00和17:00之间工作,这是我想要的范围?Postgres有一个复杂的日期/时间函数,名为 以下查询将为您提供work_hours表中没有重叠12:00>15的记录的工人ID;30个时隙。这基本上意味着这些工人在整个时间段内都可以工作一周
SELECT DISTINCT worker_id
FROM work_hours w
WHERE NOT EXISTS (
SELECT 1
FROM work_hours w1
WHERE
w1.worker_id = w.worker_id
AND (TIME '12:00:00', TIME '15:30:00') OVERLAPS (starts_at, ends_at)
)
你可以使用不等式。这使您可以更好地控制是否包括边界:
select w.*
from works w
where not exists (select 1
from worker_hours wh
where wh.worker_id = w.worker_id and
wh.starts_at < '15:30:00' and
wh.ends_at > '12:00:00'
);
这不包括比较中的边界。它还假设有一个包含所有工作人员ID的单独表,这似乎是合理的。您的问题不一致。你想要在这段时间内工作或不工作的工作人员吗?星期几重要吗?