我正在尝试在 Oracle 数据库中计算员工的服务年限。下表包含两名员工的一些示例数据。计算将从第一个 HIREDATE 到随后的 TERMDATE,然后从下一个 REHIREDATE 到下一个 TERMDATE,依此类推。这些将是活跃员工,因此最后一个 TERMDATE 将根据 SYSDATE 计算。
我正在寻找的结果是每位员工的总服务年限(以年和月为单位)。 EMPNO 10166 = 18 年 2 个月,EMPNO 06680 = 18 年 6 个月。
EMPNO | 聘用日期 | 终止日期 | 重新雇用日期 |
---|---|---|---|
10166 | 2005 年 2 月 5 日 | 2007 年 9 月 15 日 | 2008 年 1 月 17 日 |
10166 | 2005 年 2 月 5 日 | 2014 年 3 月 24 日 | 2014 年 8 月 16 日 |
10166 | 2005 年 2 月 5 日 | 2016 年 8 月 23 日 | 2017 年 2 月 6 日 |
06680 | 98 年 9 月 21 日 | 2008 年 3 月 20 日 | 2009 年 7 月 13 日 |
06680 | 98 年 9 月 21 日 | 11 年 10 月 17 日 | 2016 年 8 月 29 日 |
06680 | 98 年 9 月 21 日 | 2017 年 7 月 27 日 | 2018 年 9 月 24 日 |
with data(empno, hiredate, termdate, rehiredate) as (
select '10166', to_date('05-FEB-05', 'DD-MON-RR'), to_date('15-SEP-07', 'DD-MON-RR'), to_date('17-JAN-08', 'DD-MON-RR') union all
select '10166', to_date('05-FEB-05', 'DD-MON-RR'), to_date('24-MAR-14', 'DD-MON-RR'), to_date('16-AUG-14', 'DD-MON-RR') union all
select '10166', to_date('05-FEB-05', 'DD-MON-RR'), to_date('23-AUG-16', 'DD-MON-RR'), to_date('06-FEB-17', 'DD-MON-RR') union all
select '06680', to_date('21-SEP-98', 'DD-MON-RR'), to_date('20-MAR-08', 'DD-MON-RR'), to_date('13-JUL-09', 'DD-MON-RR') union all
select '06680', to_date('21-SEP-98', 'DD-MON-RR'), to_date('17-OCT-11', 'DD-MON-RR'), to_date('29-AUG-16', 'DD-MON-RR') union all
select '06680', to_date('21-SEP-98', 'DD-MON-RR'), to_date('27-JUL-17', 'DD-MON-RR'), to_date('24-SEP-18', 'DD-MON-RR') -- union all
)
select d.empno, trunc(delta / 365) as years,
trunc((delta - trunc(delta / 365) * 365) / (365/12)) as months
from (
select d.empno, sum(delta) as delta from (
select d.*, nvl(termdate - lag(rehiredate,1) over(partition by empno order by hiredate,termdate),
termdate - hiredate)
+ case when lead(hiredate) over(partition by empno order by hiredate,termdate) is null
then sysdate - rehiredate else 0 end
as delta
from data d
) d
group by d.empno
) d
order by empno
;
雇员 | 年 | 月 |
---|---|---|
06680 | 18 | 5 |
10166 | 18 | 2 |