如何比较两个有冲突的时间点之间的时间戳

时间:2019-03-12 09:06:48

标签: postgresql timestamp

我有一个约会表。我需要检查validfromvaliduntil之间的日期是否与另一条记录的日期发生冲突,该另一条记录的日期可能部分或全部在另一条记录的日期之间。

例如在下面的图片中,记录2的日期08.02.2019-05.02.2019与记录3的日期03.02.2019-09.02.2019冲突,因为日期08.02.2019和09.02.2017在第三条记录的范围内。

enter image description here

我如何能够生成一个结果表,向我显示每个工作人员有任何冲突的约会?

换句话说,我想要这个:

enter image description here

这是基本查询要点:

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 .....

1 个答案:

答案 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);