Установка Oracle :
CREATE TABLE table_name ( EMPL, C2, C3, DateFrom, DateTo, C6, C7 ) AS
SELECT 1, 'B', 'C', DATE '2018-11-27', DATE '9999-12-31', 'D', 'E' FROM DUAL UNION ALL
SELECT 2, 'B', 'C', DATE '2018-11-27', DATE '2019-05-31', 'D', 'E' FROM DUAL UNION ALL
SELECT 3, 'B', 'C', DATE '2017-11-27', DATE '2019-06-30', 'D', 'E' FROM DUAL;
Запрос :
WITH years ( EMPL, C2, C3, DateFrom, DateTo, C6, C7, YearEnd ) AS (
SELECT t.*,
ADD_MONTHS( TRUNC( DateFrom, 'YYYY' ), 12 ) - 1
FROM table_name t
UNION ALL
SELECT EMPL,
C2,
C3,
YearEnd + 1,
DateTo,
C6,
C7,
CASE WHEN YearEnd + 1 < SYSDATE
THEN ADD_MONTHS( YearEnd, 12 )
ELSE DateTo
END
FROM years
WHERE YearEnd < DateTo
)
SELECT EMPL,
C2,
C3,
DateFrom,
LEAST( YearEnd, DateTo ) AS DateTo,
C6,
C7
FROM years
ORDER BY Empl, C2, C3, C6, C7, DateFrom;
Вывод :
EMPL C2 C3 DATEFROM DATETO C6 C7
---- -- -- ---------- ---------- -- --
1 B C 2018-11-27 2018-12-31 D E
1 B C 2019-01-01 9999-12-31 D E
2 B C 2018-11-27 2018-12-31 D E
2 B C 2019-01-01 2019-05-31 D E
3 B C 2017-11-27 2017-12-31 D E
3 B C 2018-01-01 2018-12-31 D E
3 B C 2019-01-01 2019-06-30 D E