Kalender deel 1: Erkende feestdagen

Om van een bepaald jaar de erkende feestdagen van Nederland te bepalen gebruik ik al jaren hetzelfde stukje PL/SQL-code. De aankomende troonswisseling, en daarmee het wijzigen van de nationale feestdag Koninginnedag naar Koningsdag, was voor mij de aanleiding om de bewuste code eens te reviseren.

Nederland kent de volgende elf erkende feestdagen:

  • Nieuwjaarsdag
  • Goede vrijdag
  • 1e en 2e Paasdag
  • Koninginnedag/Koningsdag
  • Hemelvaartsdag
  • Bevrijdingsdag
  • 1e en 2e Pinksterdag
  • 1e en 2e Kerstdag

De ‘blauwe’ feestdagen vallen ieder jaar op dezelfde datum, de ‘groene’ feestdagen zijn alle af te leiden uit de 1e Paasdag en de dag waarop Nederland Koning(s)(inne)dag viert, wordt bepaald door de verjaardag van de regerende vorst.

1e Paasdag oftewel paaszondag is met behulp van het algoritme van J.M. Oudin (1940) te berekenen. Geldig voor de Gregoriaanse kalender, dus vanaf 1583. In de PL/SQL-code hieronder heb ik het algoritme uitgewerkt.

create or replace function easter_sunday
(p_year number := to_char(sysdate,'yyyy'))
return date
/**********************
* 2013 www.orcado.nl *
**********************/
is
l1 pls_integer;
l2 pls_integer;
l3 pls_integer;
l4 pls_integer;
l5 pls_integer;
l6 pls_integer;
l7 pls_integer;
begin
if p_year < 1583 then
return null;
end if;
l1 := trunc(p_year / 100);
l2 := mod(p_year,19);
l3 := l1 - trunc(l1 / 4);
l4 := mod(l3 - trunc((l1 - trunc((l1 - 17) / 25)) / 3) + 19 * l2 + 15,30);
l5 := trunc(l4 / 28);
l6 := l4 - l5 * (1 - l5 * trunc(29 / (l4 + 1)) * trunc((21 - l2) / 11));
l7 := mod(p_year + trunc(p_year/4) + l6 + 2 - l3,7);
return to_date('0103' || p_year,'ddmmyyyy') + l6 - l7 + 27;
end easter_sunday;
/

SQL> select easter_sunday from dual;

EASTER_SUNDAY
-------------
31-03-2013

SQL> select easter_sunday(2025) from dual;

EASTER_SUNDAY(2025)
-------------------
20-04-2025

Koninginnedag doet zijn intrede op 31 augustus 1898 toen Wilhelmina koningin van Nederland werd. Sinds 1949 is Koninginnedag op de verjaardag van koningin Juliana, 30 april. Vanaf 2014 zal Koningsdag gevierd gaan worden op 27 april, de verjaardag van dan koning Willem-Alexander. Wanneer vanaf 1949 Koning(s)(inne)dag op een zondag valt, wordt het één dag verplaatst. Tot 1980 werd Koninginnedag verplaatst naar maandag 1 mei. Sinds 1980 wordt het de dag ervoor op zaterdag gevierd. Het bepalen van Koning(s)(inne)dag heb ik als volgt uitgewerkt.

create or replace function kingsday
(p_year number := to_char(sysdate,'yyyy'))
return date
/**********************
* 2013 www.orcado.nl *
**********************/
is
l_day  varchar2(4);
l_date date;
begin
if p_year < 1898 then
return null;
elsif p_year < 1949 then
l_day := '3108';
elsif p_year < 2014 then
l_day := '3004';
else
l_day := '2704';
end if;
l_date := to_date(l_day || p_year,'ddmmyyyy');
if p_year > 1948
and to_char(l_date,'dy','nls_date_language=dutch') = 'zo' then
l_date := l_date + sign(19795 / 10 - p_year);
end if;
return l_date;
end kingsday;
/

SQL> select kingsday from dual;

KINGSDAY
----------
30-04-2013

SQL> select kingsday(2025) from dual;

KINGSDAY(2025)
--------------
26-04-2025

Bovenstaande stukken code heb ik geïntegreerd in het onderstaande voorbeeld, waarin bij een opgegeven jaar de erkende feestdagen worden getoond. Condities die hierin zijn opgenomen, zijn:

  • Geldig voor jaren vanaf 1583
  • Koninginnedag vanaf 1898 tot 2014
  • Koningsdag vanaf 2014
  • Bevrijdingsdag vanaf 1990
  • Goede vrijdag = 1e Paasdag – 2 dagen
  • 2e Paasdag = 1e Paasdag + 1 dag
  • Hemelvaartsdag = 1e Paasdag + 39 dagen
  • 1e Pinksterdag = 1e Paasdag + 49 dagen
  • 2e Pinksterdag = 1e Paasdag + 50 dagen

 

 

Zo, in ieder geval tot de volgende troonsopvolging van prinses Amalia is de code weer up-to-date.

Lees verder in deel 2.