Я пытаюсь выяснить, как рассчитать диапазоны дат (острова), в которых все работники работали все вместе. Другими словами, если один из рабочих не находится на какой-то дате, то эту дату следует исключить из результата. Ниже пример данных:
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(1, '2019-10-01', '2020-04-30');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(1, '2020-05-01', '2020-07-19');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(1, '2020-10-01', '9999-01-01');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(2, '2019-10-01', '2020-04-30');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(2, '2020-05-01', '2020-07-31');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(2, '2020-11-01', '9999-01-01');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(3, '2018-03-12', '2018-08-20');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(3, '2019-10-01', '2020-04-15');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(3, '2020-07-01', '2020-07-31');
insert into WORK_DAYS(WORKER_ID, DATE_FROM, DATE_TO) VALUES(3, '2020-11-01', '9999-01-01');
Я работаю с базой данных Firebird, но вы можете показать результат в любой базе данных, такой как SQL Server (но, пожалуйста, без перекрестного применения только то, что определено в стандарте SQL). Это упрощенные данные, полученные уже из проблемы пробелов/островов. Поскольку действительно worker_id в моем образце — это целая команда.
Я знаю, как найти перекрывающиеся диапазоны дат, но я не знаю, как найти перекрывающиеся диапазоны дат, применяемые ко всем работникам одновременно.