我有一个约会表。我需要检查validfrom
和validuntil
之间的日期是否与另一条记录的日期发生冲突,该另一条记录的日期可能部分或全部在另一条记录的日期之间。
例如在下面的图片中,记录2的日期08.02.2019-05.02.2019与记录3的日期03.02.2019-09.02.2019冲突,因为日期08.02.2019和09.02.2017在第三条记录的范围内。
我如何能够生成一个结果表,向我显示每个工作人员有任何冲突的约会?
换句话说,我想要这个:
这是基本查询要点:
select sa.staffid,sa.appointmentid,a.validfrom,a.validuntil
from staffappointment sa
join staff s on s.id = sa.staffid
join appointment a on a.id = sa.appointmentid
where .....
答案 0 :(得分:2)
您必须使用自连接并检查是否重叠:
SELECT sa1.staffid, sa1.appointmentid, a1.validfrom, a1.validuntil
FROM staffappointment AS sa1
JOIN appointment a1 ON a1.id = sa1.appointmentid
JOIN staffappointment AS sa2
ON sa1.staffid = sa2.staffid AND sa1.appointmentid <> sa2.appointmentid
JOIN appointment a2 ON a2.id = sa2.appointmentid
WHERE tstzrange(a1.validfrom, a1.validuntil) && tstzrange(a2.validfrom, a2.validuntil);