Bonjour,
Voici une solution au problème en utilisant la fonction analytique 'lead' pour comarer la date avec la date suivante, 'add_months' pour comparer avec le mois suivant, et un 'connect by' pour faire le lien des dates qui se suivent:
1 2 3 4 5 6 7 8 9
| select "Date" date_deb,connect_by_root("Date") date_fin
from (
select
"Date" ,
case lead("Date") over (order by "Date") when add_months("Date",1) then add_months("Date",1) end suivant
from t
)
where connect_by_isleaf=1
connect by suivant = prior "Date" start with suivant is null |
Pour info, j'ai créé la table de test avec:
create table t as
select to_date('1-1-2007','mm-dd-yyyy') "Date" from dual
union all select to_date('2-1-2007','mm-dd-yyyy') "Date" from dual
union all select to_date('3-1-2007','mm-dd-yyyy') "Date" from dual
union all select to_date('4-1-2007','mm-dd-yyyy') "Date" from dual
union all select to_date('1-1-2008','mm-dd-yyyy') "Date" from dual
union all select to_date('2-1-2008','mm-dd-yyyy') "Date" from dual
union all select to_date('1-1-2009','mm-dd-yyyy') "Date" from dual
et le résultat est:
DATE_DEB DATE_FIN
--------- ---------
01-JAN-07 01-APR-07
01-JAN-08 01-FEB-08
01-JAN-09 01-JAN-09
Cordialement,
Franck.
Partager