Actualités : analyse de données, Business Intelligence, Data Science, Big Data
Forums, dernières contributions

Jours fériés en pl/sql ?

 fab
Mardi 10 Avril 2007

Version imprimable
[Ignorer]
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
Vendredi 13 Avril 2007

Version imprimable
[Ignorer]
Merci pour ta réponse complète, je vais essayer de décrypter tout ça ;-)
 ecclectica
Vendredi 25 Septembre 2009

Version imprimable
[Ignorer]
-- 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
Vendredi 25 Septembre 2009

Version imprimable
[Ignorer]
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
Vendredi 25 Septembre 2009

Version imprimable
[Ignorer]
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
Vendredi 25 Septembre 2009

Version imprimable
[Ignorer]
if lR
 ecclectica
Vendredi 25 Septembre 2009

Version imprimable
[Ignorer]
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
Lundi 5 Octobre 2009

Version imprimable
[Ignorer]
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
Vendredi 13 Septembre 2013

Version imprimable
[Ignorer]
thank you so muche for the function ECCLECTICA!


Twitter
Rss
LinkedIn
Facebook
Apple Podcast
App Store
Google Play Store