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
| WITH t_date AS
(
SELECT TO_DATE('01.09.2011 09:30','DD.MM.YYYY HH24:MI')date_deb, TO_DATE('01.09.2011 15:00','DD.MM.YYYY HH24:MI') date_fin FROM dual
UNION ALL SELECT TO_DATE('01.09.2011 14:00','DD.MM.YYYY HH24:MI'), TO_DATE('02.09.2011 10:00','DD.MM.YYYY HH24:MI') FROM DUAL
UNION ALL SELECT TO_DATE('01.09.2011 14:00','DD.MM.YYYY HH24:MI'), TO_DATE('05.09.2011 10:00','DD.MM.YYYY HH24:MI') FROM DUAL
UNION ALL SELECT TO_DATE('02.09.2011 14:00','DD.MM.YYYY HH24:MI'), TO_DATE('12.09.2011 14:00','DD.MM.YYYY HH24:MI') FROM DUAL
UNION ALL SELECT TO_DATE('04.09.2011 14:00','DD.MM.YYYY HH24:MI'), TO_DATE('12.09.2011 14:00','DD.MM.YYYY HH24:MI') FROM DUAL
)
SELECT
date_deb,
date_fin,
-- durée de travail du premier jour
(CASE WHEN TO_CHAR(date_deb,'D') = 1 THEN 0
ELSE 18 - TO_CHAR(date_deb, 'hh24') - TO_CHAR(date_deb, 'mi')/60
END)
-- durée de travail du dernier jour
+ (CASE WHEN TO_CHAR(date_fin,'D') = 1 THEN 0
ELSE (TO_CHAR(date_fin, 'hh24') + TO_CHAR(date_fin, 'mi')/60) - 8
END)
-- durée correspondant à des jours entiers
+ 10 *
(
-- nombre de jours entiers entre le début et la fin
TRUNC(date_fin) - TRUNC(date_deb) - 1
-
--nombre de dimanches dans l'intervalle
(CASE WHEN TRUNC(NEXT_DAY(date_deb - 1,'SUN')) >= TRUNC(date_fin) THEN 0
ELSE 1 + TRUNC( ( TRUNC(date_fin) - TRUNC(NEXT_DAY(date_deb - 1,'SUN') ) ) / 7 )
END)
) duree
FROM t_date |
Partager