员工表 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
将一个区间按其中包含的段划分为多个部分的问题。
主要思想是将假期表的行乘以 2 倍 - 假期本身以及假期之后到下一个假期的时间。如果这是该员工的第一个假期线,请添加另一条线,从他的工作开始到第一个假期。
看一下例子。示例数据已有所扩展。
- 第一个员工没有去休假
- 第二个员工在期间两次休假
- 第三个员工在假期结束当天辞职(休假并解雇)
- 第四个员工休假 1 天
-第五个放假开始工作
--第六个放假后就去度假
小提琴