Juste une petite fonction SQL pour calculer la date de pâques et toutes les dates qui en découlent (Lundi de Pâques, Ascension, Pentecôte et Lundi de Pentecôte)
L’algorithme utilisé pour ce calcul est celui de Oudin
-- fonction de calcul de la date de pâques
CREATE FUNCTION dbo.F_CALCULE_PAQUES (@AN INT)
RETURNS DATE
/******************************************************************************
* fonction table de calcul de la date de pâques *
*******************************************************************************
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-03-20 *
******************************************************************************/
AS
BEGIN
DECLARE @G INT, @C INT, @C4 INT, @E INT, @H INT, @K INT, @P INT, @Q INT,
@I INT, @B INT, @J1 INT, @J2 INT, @R INT;
SELECT @G = @AN % 19, @C = @AN / 100, @B = (@AN / 4) + @AN;
SELECT @C4 = @C / 4, @E = ((8 * @C) + 13) / 25;
SELECT @H = ((19 * @G) + @C - @C4 - @E + 15) % 30;
SELECT @K = @H / 28, @P = 29 / (@H + 1), @Q = (21 - @G) / 11;
SELECT @I = (((@K * @P * @Q) - 1 ) * @K) + @H;
SELECT @J1 = @B + @I + 2 + @C4 - @C;
SELECT @J2 = @J1 % 7;
SELECT @R = 28 + @I - @J2;
RETURN DATEADD(day, @R - 1, CAST(CAST(@AN AS CHAR(4)) +'0301' AS DATE));
END
GO
Utilisation :
SELECT dbo.F_CALCULE_PAQUES (2009)
Les autres dates des jours fériés mobiles sont calculées d’après la date de Pâque comme suit :
- Lundi de pâques = Pâques + 1
- Pentecôte = Pâques + 50
- Lundi de Pentecôte = Pâques + 51
- Ascension = Pâques 40 (jeudi)
Exemple d’utilisation :
WITH
T AS
(SELECT DISTINCT dbo.F_CALCULE_PAQUES(2009) AS P
),
D AS
(SELECT P, 'Pâques' AS NOM
FROM T
UNION ALL
SELECT DATEADD(day, 1, P), 'Lundi de Pâques'
FROM T
UNION ALL
SELECT DATEADD(day, 39, P), 'Ascension'
FROM T
UNION ALL
SELECT DATEADD(day, 49, P), 'Pentecôte'
FROM T
UNION ALL
SELECT DATEADD(day, 50, P), 'Lundi de Pentecôte'
FROM T)
SELECT *
FROM D
Dont voici le résultat :
P NOM
---------- ------------------
2009-04-12 Pâques
2009-04-13 Lundi de Pâques
2009-05-22 Ascension
2009-06-01 Pentecôte
2009-06-02 Lundi de Pentecôte
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
Merci pour cette fonction et cet algorithme.
Une toute petite erreur dans le calcul de l’Ascension et de la Pentecôte, il y a un jour en trop : l’Ascension tombe un vendredi, la Pentecôte un lundi et le lundi de Pentecôte un mardi.
La requête suivante fournira le bon résultat.
WITH
T AS
(SELECT DISTINCT dbo.F_CALCULE_PAQUES(2009) AS P
),
D AS
(SELECT P, ‘Pâques’ AS NOM
FROM T
UNION ALL
SELECT DATEADD(day, 1, P), ‘Lundi de Pâques’
FROM T
UNION ALL
SELECT DATEADD(day, 39, P), ‘Ascension’
FROM T
UNION ALL
SELECT DATEADD(day, 49, P), ‘Pentecôte’
FROM T
UNION ALL
SELECT DATEADD(day, 50, P), ‘Lundi de Pentecôte’
FROM T)
SELECT *
FROM D