Calcul en SQL de la date de Pâques

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  * * * * *

MVP Microsoft SQL Server

Une réflexion au sujet de « Calcul en SQL de la date de Pâques »

  1. Avatar de WaldarWaldar

    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

Laisser un commentaire