Попробуйте с ниже, Замените статические значения на имя столбца и таблицы.
WITH TEMP_CTE(ATIVOID, OSID, DT_INI,DIF_M, LVL, DT_FIM)
AS
(SELECT '12345TC' AS , '1710201409' AS OSID, TO_DATE('20/10/17 14:09:00', 'DD/MM/YYYY HH24:MI:SS') AS DT_INI,
ABS(EXTRACT(MONTH FROM TO_DATE('20/10/17 14:09:58', 'DD/MM/YYYY HH24:MI:SS'))- EXTRACT(MONTH FROM TO_DATE('01/12/17 09:03:52', 'DD/MM/YYYY HH24:MI:SS'))) AS DIF_M,
1,
TO_DATE('01/12/17 09:03:52', 'DD-MM-YYYY HH24:MI:SS' ) AS DT_FIM
FROM DUAL
UNION ALL
SELECT ATIVOID, OSID, ADD_MONTHS(DT_INI, 1) AS DT_INI,
DIF_M, LVL + 1, DT_FIM FROM TEMP_CTE WHERE LVL <= DIF_M
)
SELECT ATIVOID, OSID,
CASE WHEN LVL = 1 THEN TO_CHAR(DT_INI, 'DD-MM-YYYY HH24:MI:SS') ELSE TO_CHAR(TRUNC(DT_INI, 'MM'), 'DD-MM-YYYY HH24:MI:SS') END AS DT_INI,
CASE WHEN LVL <= DIF_M THEN TO_CHAR(TRUNC(LAST_DAY(DT_INI) + 1) - 1/(24*60*60), 'DD-MM-YYYY HH24:MI:SS') ELSE TO_CHAR(DT_FIM, 'DD-MM-YYYY HH24:MI:SS') END AS DT_FIM FROM TEMP_CTE