我正在尝试计算日期范围(岛屿),其中所有工人都一起工作。换句话说,如果有一个工人在某个日期不在,则该日期应从结果中排除。以下是样本数据:
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是整个团队。
我知道如何找到重叠的日期范围,但我不知道如何同时应用于所有工人的重叠日期范围。
WORK_DAYS
表上放置一个AFTER UPDATE OR INSERT OR DELETE
的SQL触发器,以便该新表始终自动更新。或者也许更好的是{日期,雇佣的工人数量,正在工作的工人数量}。当然,如果粒度从天逐渐细化到小时或秒,这种方法的效率会越来越低。但对于仅仅按天计算的情况应该还可以。 - Arioch 'The