员工表 EMP:EMP_ID - 员工标识符 DATE_FROM - 工作开始日期 DATE_TO - 工作结束日期
EMP_ID DATE_FROM DATE_TO
1 01.01.2022 31.12.2022
2 01.01.2022 31.12.2022
VAC 休假表: VAC_ID - 休假标识符 EMP_ID - 员工标识符 DATE_FROM - 休假开始日期 DATE_TO - 休假结束日期
VAC_ID EMP_ID DATE_FROM DATE_TO
1 2 03.02.2022 10.02.2022
7 2 03.04.2022 10.04.2022
EMP_ID - 员工标识符 VAC_ID - NULL,如果员工在此间隔期间工作/假期标识符,如果他正在休假 DATE_FROM - 间隔的开始日期 DATE_TO - 间隔的结束日期
我无法在 sql 中想出简单的解决方案(只有在 pl/sql 中有效的东西)。
如何显示每个员工的休假/不休假状态间隔?
with employees as (
select 1 as emp_id, to_date('01.01.2022', 'dd.mm.yyyy') as date_from, to_date('31.12.2022', 'dd.mm.yyyy') as date_to from dual
union all
select 2 as emp_id, to_date('01.01.2022', 'dd.mm.yyyy') as date_from, to_date('31.12.2022', 'dd.mm.yyyy') as date_to from dual
)
, vacations as (
-- первый работник в отпуск не ходил
-- второй работник был два раза в отпуске в середине периода
select 1 as vac_id, 2 as emp_id, to_date('03.02.2022', 'dd.mm.yyyy') as date_from, to_date('10.02.2022', 'dd.mm.yyyy') as date_to from dual
union all
select 7 as vac_id, 2 as emp_id, to_date('03.04.2022', 'dd.mm.yyyy') as date_from, to_date('10.04.2022', 'dd.mm.yyyy') as date_to from dual
)
你需要这个结果:
EMP_ID VAC_ID DATE_FROM DATE_TO
1 null 01.01.2022 31.12.2022
2 null 01.01.2022 02.02.2022
2 1 03.02.2022 10.02.2022
2 null 11.02.2022 02.04.2022
2 7 03.04.2022 10.04.2022
2 null 11.04.2022 31.12.2022