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 ;-)
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; / Gamouh Said
Bonjour,
Ci-dessous une fonction PL/SQL qui permet de vérifier si un jour est férrié ou non. CREATE OR REPLACE Function WRK.F_IsFerie (dtDate DATE, FL_Week_Ferie NUMBER ) RETURN NUMBER -- Fonction qui prend en paramètre deux variables: -- dtDate: Date -- FL_Week_Ferie : Flag permettant de dire si le week end peut etre considèré comme jour férié ou pas. -- FL_Week_Ferie = 1 => Oui -- FL_Week_Ferie = 0 => Non AS lgTmp1 INTEGER; lgTmp2 INTEGER; stDate VARCHAR2(10); stType NUMBER; Annee NUMBER(4); Lundi_paques VARCHAR2(10); Lundi_pencote VARCHAR2(10); Ascension VARCHAR2(10); Num_jour NUMBER :=0; BEGIN stType := 0; lgTmp1:=0; lgTmp2:=0; stDate := F_ConvertDate(dtDate); Annee := TO_CHAR(dtDate, 'YYYY'); Lundi_paques := F_ConvertDate(F_Dimanche_de_Paques(Annee)+1); --'Lundi de paqûes' , Lundi_pencote := F_ConvertDate(F_Dimanche_de_Paques(Annee) + 50); --' Lundi de Pencote', Ascension := F_ConvertDate(F_Dimanche_de_Paques(Annee) + 39); --' Ascension' -- Jours fériés fixes -- Nouvel AN 1er janvier -- Fête du travail 1er mai -- Victoire 8 mai -- Fête nationale 14 juillet -- Assomption 15 Aout -- Toussaint 1er Novemmbre -- Armistice 11 Novembre -- Noêl 25 Décembre -- Lundi de paqûes -- Lundi de pencote -- Ascension IF (stDate IN ('0101','0105','0805','1407','1508','0111','1111','2512',Lundi_paques,Lundi_pencote,Ascension)) THEN lgTmp1 := 1; end if; IF FL_Week_Ferie = 1 THEN Num_jour := TO_CHAR(dtDate,'D'); IF Num_jour > 5 THEN lgTmp2:= 1; ELSE lgTmp2:= 0; END IF; END IF; IF lgTmp1 Towandaa
thank you so muche for the function ECCLECTICA!
|