Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何找到给定开始和结束时间的可用工人?_Sql_Postgresql - Fatal编程技术网

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的单独表,这似乎是合理的。

您的问题不一致。你想要在这段时间内工作或不工作的工作人员吗?星期几重要吗?