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 30 31 32 33 34 35
| WITH
TEMP AS
(
SELECT TO_DATE('24/03/2010 11:11:11', 'DD/MM/YYYY HH24:MI:SS') AS DATEDEBUT, TO_DATE('06/04/2010 16:16:16', 'DD/MM/YYYY HH24:MI:SS') AS DATEFIN FROM DUAL
),
FERIE AS
(
SELECT TO_DATE('01/01/2010', 'DD/MM/YYYY') AS JOUR FROM DUAL
)
SELECT
TEMP.DATEDEBUT AS DATE_DEBUT,
TEMP.DATEFIN AS DATE_FIN,
--Nombre de samedis et dimanches des semaines complètes qu'il est possible de former entre les 2 dates.
FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - TRUNC(TEMP.DATEDEBUT)) / 7) * 2
--Durée en nombre de jours du premier week-end de la semaine restante.
+ GREATEST(LEAST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT), 'DAY'), 'LUNDI'), (TRUNC(TEMP.DATEFIN) + 1) - (FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - TRUNC(TEMP.DATEDEBUT)) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT), 'DAY'), 'SAMEDI'), TRUNC(TEMP.DATEDEBUT)), 0)
--Durée en nombre de jours du deuxième week-end de la semaine restante.
--Exemple : ce cas peut se présenter si la semaine restante commence le samedi 10/04/2010 à 22:00, et se termine le samedi 17/04/2010 à 08:00.
+ GREATEST(LEAST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT) + INTERVAL '7' DAY, 'DAY'), 'LUNDI'), (TRUNC(TEMP.DATEFIN) + 1) - (FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - TRUNC(TEMP.DATEDEBUT)) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT) + INTERVAL '7' DAY, 'DAY'), 'SAMEDI'), TRUNC(TEMP.DATEDEBUT)), 0)
--Nombre de jours fériés qui ne sont ni un samedi ni un dimanche (car déjà comptabilisés).
+ NVL(SUM(GREATEST(LEAST(TRUNC(JOUR + INTERVAL '1' DAY, 'DD'), (TRUNC(TEMP.DATEFIN) + 1)) - GREATEST(TRUNC(JOUR, 'DD'), TRUNC(TEMP.DATEDEBUT)), 0)), 0)
AS JOURS_NON_OUVRES
FROM
TEMP
LEFT OUTER JOIN FERIE ON TO_CHAR(JOUR, 'D') NOT IN (6, 7)
GROUP BY
TEMP.DATEDEBUT,
TEMP.DATEFIN |
Partager