Calcul direct de la date de Pâques en SQL

La requête paramétrée suivante calcule directement la date du Dimanche de Pâques entre 1900 et 2099 sans faire intervenir une fonction VBA personnelle grâce à une formule dérivée de l’algorithme de Carter.
La date des 3 jours fériés mobiles français (Lundi de Pâques, Ascension et Lundi de Pentecôte) est également formulée, bien que le lundi de Pentecôte ne soit plus chômé depuis 2005 (journée de solidarité).

La requête SQL pour ACCESS

PARAMETERS Annee Short;
SELECT IIF(Annee BETWEEN 1900 AND 2099,
           DateSerial(
            Annee,
            3,
            (204 - 11 * (Annee MOD 19)) MOD 30 + 28 + (Annee MOD 19 IN (5,16)) - (Annee + Annee \ 4 + ((204 - 11 * (Annee MOD 19)) MOD 30 + 22 + (Annee MOD 19 IN (5,16)))) MOD 7
           ),
           NULL
          ) AS [Dimanche de Pâques],
      [Dimanche de Pâques] + 1  AS [Lundi de Pâques],
      [Dimanche de Pâques] + 39 AS [Ascension],
      [Dimanche de Pâques] + 50 AS [Lundi de Pentecôte]

 
Remarques
Si vous souhaitez extrapoler la formule à d’autres SQL, il faut savoir que sous Access :

  • True = -1 donc (Annee MOD 19 IN (5,16)) retourne -1 si vrai;
  • L’opérateur ‘\’ de Annee \ 4 retourne seulement la partie entière de la division;
  • Attention aussi à la priorité des opérateurs…

Il n’est pas possible non plus de copier directement la formule dans une fonction VBA car elle utilise des opérateurs spécifiques SQL (Between et In).
 
Exemples
Au lancement de la requête, un popup demande de saisir l’année souhaitée.

Dimanche    Lundi de
de Pâques   Pâques      Ascension   Lundi de Pentecôte
15/04/1900  16/04/1900  24/05/1900  04/06/1900
18/04/1954  19/04/1954  27/05/1954  07/06/1954
08/04/2012  09/04/2012  17/05/2012  28/05/2012
21/04/2019  22/04/2019  30/05/2019  10/06/2019
12/04/2099  13/04/2099  21/05/2099  01/06/2099

Si l’année est en dehors de la plage 1900 – 2099, NULL est renvoyé pour chaque colonne.

A noter
La formule pour le calcul des jours ouvrables de la FAQ Access n’est valable que pour la période comprise entre 1982 et 2048.

@+

Philippe

Laisser un commentaire