1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| with cte_matable as
(
select 'A01' as code
, date '2012-10-15' as dt_deb
, date '2014-11-16' as dt_fin
from dual
union all
select 'A02'
, date '2016-01-02'
, date '2016-12-30'
from dual
union all
select 'A03'
, date '2015-06-05'
, date '2014-06-01'
from dual
)
select code
, greatest(dt_deb, trunc(dt_deb, 'yyyy') + (level - 1) * interval '1' year) as dt_deb
, least(dt_fin, trunc(dt_fin, 'yyyy') + (level - trunc(months_between(trunc(dt_fin, 'yyyy'), trunc(dt_deb, 'yyyy'))/12)) * interval '1' year - 1) as dt_fin
from cte_matable
connect by level <= 1 + trunc(months_between(trunc(dt_fin, 'yyyy'), trunc(dt_deb, 'yyyy'))/12)
and prior code = code
and prior dbms_random.value is not null; |
Partager