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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| WITH
T_T AS
(SELECT TRF_ID, TRF_DEBUT,
CASE
WHEN TRF_FIN < TRF_DEBUT THEN TRF_FIN + 24.0
ELSE TRF_FIN
END AS TRF_FIN,
TRF_PRIX
FROM T_TARIF_TRF),
T_TRF24 AS
(SELECT TRF_ID, TRF_DEBUT, TRF_FIN, TRF_PRIX,
TRF_FIN - TRF_DEBUT AS TRF_NB_H
FROM T_T),
T_TRF AS
(SELECT TRF_ID, TRF_DEBUT, TRF_FIN, TRF_PRIX
FROM T_TRF24
WHERE TRF_FIN <= 24
UNION ALL
SELECT TRF_ID, TRF_DEBUT, 24, TRF_PRIX
FROM T_TRF24
WHERE TRF_FIN > 24
UNION ALL
SELECT TRF_ID, 0, TRF_FIN - 24, TRF_PRIX
FROM T_TRF24
WHERE TRF_FIN > 24
),
T_P AS
(SELECT 23 AS PRM_DEBUT, 7.0 AS PRM_FIN
-- FROM DUAL -- si vous êtes sous Oracle
),
T_PRM24 AS
(SELECT PRM_DEBUT,
CASE
WHEN PRM_FIN < PRM_DEBUT THEN PRM_FIN + 24.0
ELSE PRM_FIN
END AS PRM_FIN
FROM T_P),
T_PRM AS
(SELECT PRM_DEBUT, PRM_FIN
FROM T_PRM24
WHERE PRM_FIN <= 24
UNION ALL
SELECT PRM_DEBUT, 24
FROM T_PRM24
WHERE PRM_FIN > 24
UNION ALL
SELECT 0, PRM_FIN - 24
FROM T_PRM24
WHERE PRM_FIN > 24) ,
T_LIF AS
(SELECT TRF_DEBUT, TRF_FIN, TRF_PRIX,
CASE
WHEN PRM_DEBUT BETWEEN TRF_DEBUT
AND TRF_FIN THEN PRM_DEBUT
ELSE TRF_DEBUT
END AS PRM_DEBUT,
CASE
WHEN PRM_FIN BETWEEN TRF_DEBUT
AND TRF_FIN THEN PRM_FIN
ELSE TRF_FIN
END AS PRM_FIN
FROM T_TRF AS T
INNER JOIN T_PRM AS P
ON ( T.TRF_DEBUT >= P.PRM_DEBUT
AND T.TRF_DEBUT < P.PRM_FIN)
OR ( T.TRF_FIN > P.PRM_DEBUT
AND T.TRF_FIN <= P.PRM_FIN))
SELECT *, PRM_FIN - PRM_DEBUT AS NB_H
FROM T_LIF |
Partager