Как сравнить временные метки между двумя точками времени, которые находятся в конфликте - PullRequest
0 голосов
/ 12 марта 2019

У меня есть таблица встреч. Мне нужно проверить, что никакая дата между validfrom и validuntil не конфликтует с другой записью, у которой есть дата, которая может быть частично или полностью между датой другой записи.

например. на рисунке ниже дата 2 записи 08.02.2019 - 05.02.2019 находится в конфликте с датой 3 записи 03.02.2019 - 09.02.2019, поскольку дни 08.02.2019 и 09.02.2017 находятся в диапазоне 3-й записи.

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 Ответ

2 голосов
/ 12 марта 2019

Вы должны использовать самостоятельное соединение и проверить наличие совпадений:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...