1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| select to_char(CALENDRIER.DATE_ETAT,'dd/mm/yyyy') DATE_ETAT
, round(nvl(sum(DECOUPAGE_PAR_J.fin_par_jour - DECOUPAGE_PAR_J.deb_par_jour), 0)*86400) DUREE
FROM (SELECT PERIODE.DATE_DEBUT + rownum - 1 DATE_ETAT
FROM (SELECT TRUNC(MIN(TO_DATE (DATE_DEBUT,'DD/MM/YYYY HH24:MI:SS'))) DATE_DEBUT,
TRUNC(MAX(TO_DATE (DATE_FIN,'DD/MM/YYYY HH24:MI:SS'))) DATE_FIN
FROM DATA IND) PERIODE
connect by level <= PERIODE.DATE_FIN - PERIODE.DATE_DEBUT + 1) CALENDRIER,
(SELECT CALENDRIER.DATE_ETAT,
CASE WHEN TRUNC(PERIODE.DATE_DEBUT) = trunc(CALENDRIER.DATE_ETAT)
then PERIODE.DATE_DEBUT
else CALENDRIER.DATE_ETAT
end deb_par_jour,
-- Si le jour J est celui de la date de fin alors on prend la date de fin pour avoir l'heure de fin sinon la fin est le lendemain du jour J
case when trunc(PERIODE.DATE_FIN) = trunc(CALENDRIER.DATE_ETAT)
then PERIODE.DATE_FIN
else CALENDRIER.DATE_ETAT + 1
end fin_par_jour
FROM (SELECT PERIODE.DATE_DEBUT + rownum - 1 DATE_ETAT
FROM (SELECT TRUNC(MIN(TO_DATE (DATE_DEBUT,'DD/MM/YYYY HH24:MI:SS'))) DATE_DEBUT,
TRUNC(MAX(TO_DATE (DATE_FIN,'DD/MM/YYYY HH24:MI:SS'))) DATE_FIN
FROM DATA IND) PERIODE
connect by level <= PERIODE.DATE_FIN - PERIODE.DATE_DEBUT + 1) CALENDRIER,
(SELECT TRUNC(MIN(TO_DATE (DATE_DEBUT,'DD/MM/YYYY HH24:MI:SS'))) DATE_DEBUT,
TRUNC(MAX(TO_DATE (DATE_FIN,'DD/MM/YYYY HH24:MI:SS'))) DATE_FIN
FROM DATA IND)PERIODE
WHERE CALENDRIER.DATE_ETAT BETWEEN TRUNC(PERIODE.DATE_DEBUT) AND trunc(PERIODE.DATE_FIN)) DECOUPAGE_PAR_J
WHERE DECOUPAGE_PAR_J.DATE_ETAT(+) = CALENDRIER.DATE_ETAT
group by CALENDRIER.DATE_ETAT
order by CALENDRIER.DATE_ETAT |
Partager