Forums, dernières contributions
Jours fériés en pl/sql ? fab
Bonjour,
Dans un état de reporting j'ai besoin de connaitre les jours fériés; bien sur comme c'est variable d'une année sur l'autre et d'un pays à l'autre cette fonctionnalité n'est pas disponible dans Oracle. C'est pour ça que je demande si l'un d'entre vous a déjà travaillé ou possède une fonction en PL/SQL qui donne les jours fériés ? fab
Merci pour ta réponse complète, je vais essayer de décrypter tout ça ;-)
las
slt,
voici un autre algo(de OUDIN) bcp plus simple qui est basé sur la division entière. La donction retourne le dimanche de päques (en date) elle est ecrite ici en C++/CLI mais tu peux l'adapter a tt c que tu veux DateTime EasternSunday(int vnYear) { int G, C, C_4, E, H, K, P, Q, I, B, J1, J2, R; DateTime eSunday; G = vnYear % 19; C = (int)(vnYear / 100.0); C_4 = (int)(C / 4.0); E =(int)((8 * C + 13) /25.0); H = (19 * G + C - C_4 - E + 15) % 30; K = (int)(H /28.0); P = (int)(29 /(H + 1)); Q = (int)((21 - G) / 11.0); I = (K * P * Q - 1) * K + H; B = (int)(vnYear /4.0) + vnYear; J1 = B + I + 2 + C_4 - C; J2 = J1 % 7; R = 28 + I - J2; if (R <= 31) eSunday = System::Convert::ToDateTime(R.ToString() + '/3/' + vnYear.ToString()); else eSunday = System::Convert::ToDateTime((R - 31).ToString() + '/4/' + vnYear.ToString()); return eSunday; } Il suiffit ensuite de determiner les autres jours ferie(reliieux) comme suit: LundiPaque = DimachePaque+1jrs JeudiAscension = DimanchePaque+39jrs (' le jeudi de la sixième semaine après Pâques) DimanchePentecote = DimanchePaque + 49jrs ( le septième dimanche après Pâques) LundiPentecote = DimanchePentecote.AddDays+1jr Assomption = 15 Aout (Ferie catholique et pas ferie pour les protestant) VendredSaint = DimmanchePaque-2js(Ferie protestant et pas fere pr les catholique)... ecclectica
-- Retourne pour un jour donné l'indication si c'est un jour :
-- - ouvré (X) -- - de week-end (WE) -- - férié (JF) -- -- Traite les jours fériés fixes et mobiles (calculables) CREATE OR REPLACE Function FCT_JOURFERIE (pDate IN DATE) RETURN VARCHAR2 AS lgA INTEGER; lgMPaq INTEGER; lgJPaq INTEGER; lgTmp1 INTEGER; lgTmp2 INTEGER; lgTmp3 INTEGER; stDate VARCHAR2(10); dtPaq DATE; stPaq VARCHAR2(10); blFerie NUMBER(1); stType VARCHAR2(2); BEGIN stType := 'X'; IF TO_CHAR(pDate, 'D') in (6,7) THEN blFerie := 1; ELSE blFerie := 0; END IF; IF blFerie = 1 THEN stType := 'WE'; END IF; IF blFerie = 0 THEN stDate := TO_CHAR(pDate, 'DDMM'); -- Jours fériés fixes (1er janvier, 1er mai, 8 mai, 14 juillet, ...) IF stDate IN ('0101','0105','0805','1407','1508','0111','1111','2512') THEN blFerie := 1; END IF; END IF; IF blFerie = 0 THEN lgA := TO_CHAR(pDate, 'YYYY'); lgTmp1 := MOD((19 * MOD(lgA, 19) + 24), 30); lgTmp2 := Least(lgTmp1, Greatest(28, lgTmp1) - 1); lgTmp3 := 28 + lgTmp2 - (MOD((3 + lgA - 1900 + ((lgA - 1900) / 4) + lgTmp2), 7)); lgMPaq := 3 + (lgTmp3 / 32); IF (lgTmp3 < 32) THEN lgJPaq := lgTmp3; ELSE lgJPaq := lgTmp3 - 31; END IF; -- Construction de la date du dimanche de Pâques stPaq := TO_CHAR(lgJPaq) || '/' || TO_CHAR(lgMPaq) || '/' || TO_CHAR(lgA); dtPaq := TO_DATE(stPaq, 'DD/MM/YYYY'); -- Jours fériés mobiles (lundi de pâques, ascension, lundi de pentecôte) -- Pâques et Pentecôte non testés, puisqu'ils tombent tous les deux un dimanche. IF (pDate = (dtPaq + 2)) OR (pDate = (dtPaq + 40)) OR (pDate = (dtPaq + 51)) THEN blFerie := 1; END IF; END IF; IF blFerie = 1 AND stType = 'X' THEN stType := 'JF'; END IF; RETURN stType; END FCT_JOURFERIE; ecclectica
Oups ! Le version ci-dessus est foireuse... (algo de base foireux. Avec Oudin, cela va beaucoup mieux !)
Prendre celle-ci dessous. -- Retourne pour un jour donné l'indication si c'est un jour : -- - ouvré (X) -- - de week-end (WE) -- - férié (JF) -- -- Traite les jours fériés fixes et mobiles (calculables) CREATE OR REPLACE Function FCT_JOURFERIE (pDate IN DATE) RETURN VARCHAR2 AS lgA INTEGER; lG integer; lC integer; lD integer; lE integer; lH integer; lK integer; lP integer; lQ integer; lI integer; lB integer; lJ1 integer; lJ2 integer; lR integer; stDate VARCHAR2(10); dtPaq DATE; blFerie NUMBER(1); stType VARCHAR2(2); BEGIN stType := 'X'; IF TO_CHAR(pDate, 'D') in (6,7) THEN blFerie := 1; ELSE blFerie := 0; END IF; IF blFerie = 1 THEN stType := 'WE'; END IF; IF blFerie = 0 THEN stDate := TO_CHAR(pDate, 'DDMM'); -- Jours fériés fixes (1er janvier, 1er mai, 8 mai, 14 juillet, ...) IF stDate IN ('0101','0105','0805','1407','1508','0111','1111','2512') THEN blFerie := 1; END IF; END IF; IF blFerie = 0 THEN -- Construction de la date du dimanche de Pâques lgA := TO_CHAR(pDate, 'YYYY'); lG := mod(lgA,19); lC := trunc(lgA / 100); lD := trunc(lC / 4); lE := trunc((8 * lC + 13) / 25); lH := mod((19 * lG + lC - lD - lE + 15),30); lK := trunc(lH / 28); lP := trunc(29 /(lH + 1)); lQ := trunc((21 - lG) / 11); lI := (lK * lP * lQ - 1) * lK + lH; lB := trunc(lgA / 4) + lgA; lJ1 := lB + lI + 2 + lD - lC; lJ2 := mod(lJ1,7); lR := 28 + lI - lJ2; if lR ecclectica
CREATE OR REPLACE Function FCT_JOURFERIE (pDate IN DATE) RETURN VARCHAR2
AS lgA INTEGER; lG integer; lC integer; lD integer; lE integer; lH integer; lK integer; lP integer; lQ integer; lI integer; lB integer; lJ1 integer; lJ2 integer; lR integer; stDate VARCHAR2(10); dtPaq DATE; blFerie NUMBER(1); stType VARCHAR2(2); BEGIN stType := 'X'; IF TO_CHAR(pDate, 'D') in (6,7) THEN blFerie := 1; ELSE blFerie := 0; END IF; IF blFerie = 1 THEN stType := 'WE'; END IF; IF blFerie = 0 THEN stDate := TO_CHAR(pDate, 'DDMM'); -- Jours fériés fixes (1er janvier, 1er mai, 8 mai, 14 juillet, ...) IF stDate IN ('0101','0105','0805','1407','1508','0111','1111','2512') THEN blFerie := 1; END IF; END IF; IF blFerie = 0 THEN -- Construction de la date du dimanche de Pâques lgA := TO_CHAR(pDate, 'YYYY'); lG := mod(lgA,19); lC := trunc(lgA / 100); lD := trunc(lC / 4); lE := trunc((8 * lC + 13) / 25); lH := mod((19 * lG + lC - lD - lE + 15),30); lK := trunc(lH / 28); lP := trunc(29 /(lH + 1)); lQ := trunc((21 - lG) / 11); lI := (lK * lP * lQ - 1) * lK + lH; lB := trunc(lgA / 4) + lgA; lJ1 := lB + lI + 2 + lD - lC; lJ2 := mod(lJ1,7); lR := 28 + lI - lJ2; if lR ecclectica
if lR
ecclectica
if lR > 31 then
dtPaq := to_date(to_char(lR-31) || '/04/' || to_char(lgA), 'dd/mm/yyyy'); else dtPaq := to_date(to_char(lR) || '/03/' || to_char(lgA), 'dd/mm/yyyy'); end if; -- Jours fériés mobiles (lundi de pâques, ascension, lundi de pentecôte) -- Pâques et Pentecôte non testés, puisqu'ils tombent tous les deux un dimanche. IF (pDate = (dtPaq + 1)) OR (pDate = (dtPaq + 39)) OR (pDate = (dtPaq + 50)) THEN blFerie := 1; END IF; END IF; IF blFerie = 1 AND stType = 'X' THEN stType := 'JF'; END IF; RETURN stType; END FCTLEA_JOURFERIE; / Towandaa
thank you so muche for the function ECCLECTICA!
|