Oracle SQL 查询计算具有多个终止和重新雇用日期的员工的服务长度

问题描述 投票:0回答:1

我正在尝试在 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 日
oracle oracle-sqldeveloper
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.