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; / 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!
|