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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
| CREATE OR REPLACE Function Mini(a IN FLOAT, b IN FLOAT) RETURN FLOAT
AS
f FLOAT;
BEGIN
IF a < b THEN
f := a;
ELSE
f := b;
END IF;
RETURN f;
END Mini;
/
-----------------------------------------------------------------------
-- ================================================================= --
-----------------------------------------------------------------------
CREATE OR REPLACE Function Maxi(a IN FLOAT, b IN FLOAT) RETURN FLOAT
AS
f FLOAT;
BEGIN
IF a > b THEN
f := a;
ELSE
f := b;
END IF;
RETURN f;
END Maxi;
/
-----------------------------------------------------------------------
-- ================================================================= --
-----------------------------------------------------------------------
CREATE OR REPLACE Function IsCorrectDate (JJ IN INTEGER, MM IN INTEGER, AAAA IN INTEGER) RETURN INTEGER
AS
FlagReturn INTEGER;
BEGIN
-- Hors plage
IF JJ < 1 OR JJ > 31 OR MM < 1 OR MM > 12 THEN
FlagReturn := 0;
ELSE
-- Mois de 30 jours
IF JJ = 31 AND (MM = 4 OR MM = 6 OR MM = 9 OR MM = 11) THEN
FlagReturn := 0;
ELSE
-- Mois de février
IF MM = 2 THEN
IF JJ <= 28 THEN
FlagReturn := 1;
ELSE
IF JJ > 29 THEN
FlagReturn := 0;
ELSE
IF NOT (JJ = 29 And ((MOD(AAAA, 4) = 0 AND MOD(AAAA, 100) <> 0) Or MOD(AAAA, 400) = 0)) THEN
FlagReturn := 0;
ELSE
FlagReturn := 1;
END IF;
END IF;
END IF;
ELSE -- mois autre que fevrier
FlagReturn := 1;
END IF;
END IF;
END IF;
RETURN FlagReturn;
END IsCorrectDate;
/
-----------------------------------------------------------------------
-- ================================================================= --
-----------------------------------------------------------------------
CREATE OR REPLACE Function ConvertDate (dtDate IN DATE) RETURN VARCHAR2
AS
sJour VARCHAR2(2);
sMois VARCHAR2(2);
sResult VARCHAR2(4);
BEGIN
sJour := TO_CHAR(dtDate, 'DD');
sMois := TO_CHAR(dtDate, 'MM');
IF length(sJour) = 1 THEN
sJour := '0' || sJour;
END IF;
IF length(sMois) = 1 THEN
sMois := '0' || sMois;
END IF;
sResult := sJour || sMois;
RETURN (sResult);
END ConvertDate;
/
-----------------------------------------------------------------------
-- ================================================================= --
-----------------------------------------------------------------------
CREATE OR REPLACE Function JourFerie (dtDate IN DATE, iSamediFerie IN INTEGER DEFAULT 1) 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
-- Cette fonction indique si le jour passé en argument est férié.
-- Par défaut les samedi sont considérés comme fériés, mais le second
-- paramètre permet de changer cela.
stType := 'X';
-- Dimanche (et samedi)
IF iSamediFerie = 1 THEN
IF TO_CHAR(dtDate, 'D') = 7 or TO_CHAR(dtDate, 'D') = 6 THEN
blFerie := 1;
ELSE
blFerie := 0;
END IF;
ELSE
IF TO_CHAR(dtDate, 'D') = 7 THEN
blFerie := 1;
ELSE
blFerie := 0;
END IF;
END IF;
IF blFerie = 1 THEN
stType := 'WE';
END IF;
IF blFerie = 0 THEN
stDate := ConvertDate(dtDate);
-- 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(dtDate, 'YYYY');
lgTmp1 := MOD((19 * MOD(lgA, 19) + 24), 30);
lgTmp2 := Mini(lgTmp1, Maxi(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 (dtDate = (dtPaq + 1)) OR (dtDate = (dtPaq + 39)) OR (dtDate = (dtPaq + 50)) THEN
blFerie := 1;
END IF;
END IF;
IF blFerie = 1 AND stType = 'X' THEN
stType := 'JF';
END IF;
RETURN (stType);
END JourFerie;
/ |
Partager