Skip to Main Content
Ted Struik - Oracle
Search For
Home
Home
Ted Struik - Oracle
Search
Site Map
Statistics
Page Errors
Apex
Apex
General
Autocomplete
Conditions
Errors
Items used in PL/SQL
Validations
Dynamic Actions
Logs
Version
App-wide Items
Error Handling
Apex Views
Apex Upgrade 4.2 to 5.1
Apex Upgrade 20.2 to 23.1
Database Dependencies
Show Source Code
URLs
Authorization
Modal Dialogs
Apex Office Print (AOP)
Apex-Sert
Warn on Unsaved Changes
Form Regions
Reports
Checkboxes
Download
Errors
Nowrap Columns
Substitution Strings
Use IR results in pl/sql
Clickable Row
Row Highlight
Translate Filters etc.
Bar Charts
Column Usage
Reset Pagination
Hide IR Actions menu items
Get Classic Report query
Interactive Grid
ORA-20987
ERR-1002
Copying Text
IG Info
Multiple Row Select
Read Only Options
Search
Sort and Search
Images & Fonts
Standard Icons & Fonts
WebDav
Font Awesome
Icons/image popup LOV
Lists
Hierarchy
LOVs
Definition Bug
Set 1-item LOV to Disabled
With Clause Errors
Modal LOV Plugin
HTML / CSS / JavaScript
Vertical Align
Legend CSS
Geolocation
Apex.confirm
Pie Charts
Codemirror
Theme Roller
Catching Key Strokes
Browser Cache
Locale
RequireJS
Collapsible Regions
Find JavaScript
Import / Export
Dynamic Translations
Translated Pages
APEXExport (java)
apex_export (pl/sql)
Component Settings
Charts
Translate Charts
[Reports] Bar Charts
Shuttles
Shuttle Sorting
Disable Shuttle Items
Menus
Accordion-Like
Scroll bug
Authorization
Session State
About Session State
Rollback & Commit
Performance of v()
Apex Clone Session
Request
Session State in Views
Collections
ORA-20101 & ORA-20104
ORA-00001
Max Row Count
(PL)SQL
(PL)SQL
External Tables
SQL Plus
Conditions
Long
ORDImage
Date & Timestamp
CGI environment
Sys_context
Rounding percentages
Apex_string.split in SQL
Dbms_metadata
Instr
Regular Expressions
Rollback to Savepoint
Use table aliases
(Pipelined) Bulk Collect
JSON
Source Code Search (PL/SQL)
Source Code Search (SQL)
Format Models
Pipelined Table Functions
Hint no_unnest
Listagg
DBA
DBA
Backup & Restore
Users
Export & Import
DBMS Jobs
Tablespaces
Table Size
Flush cache
Access Control List (ACL)
Locks
Java
Constraints
Object Dependencies
Package Dependencies 1
Package Dependencies 2
Grants
SQL History
Startup Errors
ORDS
Miscellaneous
Miscellaneous
Holidays
E-mail
NLExtract
Windows
VPN
VMware
Links
Google
Visualization Orgchart
Hide Search Results
Reverse Proxy
To-do List
Cytoscape
Graphics
Upscaling
Amazon Prices
Domoticz
DDoS
Hobbies
Hobbies
Motorcycles
'95 Kawasaki ZZR 600
'94 Kawasaki ZZR 1100
'91 Honda CBR 600 F2
'95 Kawasaki ZZR 1100
'99 Honda CBR 1100 XX
'00 Honda CBR 1100 XX
'02 Kawasaki ZX-12R (NL)
'05 Ducati 999 (NL)
'08 Honda Fireblade
'07 Suzuki Bandit 1250A
'18 Suzuki GSX-S 1000 F
MotoGP
Garfield
Lyrics
Skydive
Woodworking
Pantorouter
16 inch Bandsaw
Introduction
Frame
Wheels
Wheel mounts
Blade guides
Trunions and table
Enclosure
Alignment and more
Box Joint Jig
Foldable Sawhorses
Strip Sander XL
Photography
Sony RX10 IV
Yes Minister
WinAmp
Dutch Holidays
Go
Rows
1
5
10
15
20
25
50
100
1000
All
Actions
Report Settings
Not in the Past - Row Filter
Edit Filter
Remove Filter
Not in the Past - Ro...
Holiday Date
Holiday Type
Wednesday 25-12-2024
Christmas Day
Thursday 26-12-2024
Second Day of Christmas
Wednesday 01-01-2025
New Years Day
Sunday 20-04-2025
Easter Sunday
Monday 21-04-2025
Easter Monday
Saturday 26-04-2025
King's Day
Thursday 29-05-2025
Ascension Day
Sunday 08-06-2025
Whit Sunday
Monday 09-06-2025
Whit Monday
Thursday 25-12-2025
Christmas Day
1 - 10 of 18,677
Column Actions
Search
Info
A package to determine Dutch holidays. Shouldn't be too difficult to transform into something useful for other countries.
Includes a function to calculate the date for Easter, since quite a few holidays are based on that.
Also includes a function to calculate King's Day, our national "Orange" day of celebration.
Code
Region
Identification
Sequence
10
Title
Dutch Holidays
Type
Interactive Report
Source
Source Type
DYNAMIC_QUERY
Region Source
select * from ted_holidays t
Table
Table
Name
ted_holidays
DDL
CREATE TABLE "TEDSTRUIK"."TED_HOLIDAYS" ( "HOLIDAY_DATE" DATE NOT NULL ENABLE, "HOLIDAY_TYPE" VARCHAR2(100) NOT NULL ENABLE ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS"
Package
Package
Name
ted_holiday
Source
package ted_holiday is function is_holiday ( p_date in date ) return boolean ; function days_between_dates ( p_date_1 in date , p_date_2 in date , p_freedays_free_yn in varchar2 , p_saturdays_free_yn in varchar2 , p_sundays_free_yn in varchar2 ) return pls_integer ; procedure fill_table; end ted_holiday;
Package Body
Package Body
Name
ted_holiday
Source
package body ted_holiday is c_min_startyear constant pls_integer := 1583; c_max_endyear constant pls_integer := 4099; function get_easter ( p_year in pls_integer ) return date deterministic is -- returns the first day of Easter for a given year d pls_integer; m pls_integer; result date; firstdig pls_integer; remain19 pls_integer; temp pls_integer; ta pls_integer; tb pls_integer; tc pls_integer; td pls_integer; te pls_integer; begin if p_year not between c_min_startyear and c_max_endyear then raise_application_error(-20000,'p_year must be between '||to_char(c_min_startyear,'fm')||' and '||to_char(c_max_endyear,'fm')); end if; firstdig := trunc(p_year/100); -- first 2 digits of year remain19 := p_year mod 19; -- remainder of year / 19 -- calculate pfm date temp := trunc( (firstdig - 15) / 2 ) + 202 - 11 * remain19; if firstdig in (21,24,25,27,28,29,30,31,32,34,35,38) then temp := temp - 1; elsif firstdig in (33,36,37,39,40) then temp := temp - 2; end if; temp := temp mod 30; ta := temp + 21; if temp = 29 then ta := ta - 1; end if; if (temp = 28 and remain19 > 10) then ta := ta - 1; end if; -- find the next sunday tb := (ta - 19) mod 7; tc := (40 - firstdig) mod 4; if tc = 3 then tc := tc + 1; end if; if tc > 1 then tc := tc + 1; end if; temp := p_year mod 100; td := (temp + trunc(temp / 4)) mod 7; te := ((20 - tb - tc - td) mod 7) + 1; d := ta + te; -- return the date if d > 31 then d := d - 31; m := 4; else m := 3; end if; result := to_date( to_char(d,'00')||to_char(m,'00')||to_char(p_year,'0000') ,'ddmmyyyy'); return(result); end get_easter; procedure get_kingsday ( p_year in pls_integer , o_date out date , o_holiday_type out varchar2 ) is -- returns the Dutch "Orange" day of celebration v_day varchar2(4); begin if p_year < 1898 then -- N.v.t. return; elsif p_year < 1949 then -- Wilhelmina -- "Gedurende de regeerperiode van Wilhelmina werd Koninginnedag gevierd op 31 augustus, haar verjaardag." v_day := '3108'; o_holiday_type := 'Queen''s Day'; elsif p_year < 2014 then -- Juliana en Beatrix -- "Toen Juliana aantrad, werd het feest verplaatst naar haar geboortedag 30 april. Koningin Beatrix koos er bij haar aantreden voor om de feestdag niet te verplaatsen en hem daarmee in tegenstelling tot haar moeder en grootmoeder niet op haar verjaardag, 31 januari, te vieren." v_day := '3004'; o_holiday_type := 'Queen''s Day'; else -- Willem-Alexander -- "Koningsdag wordt sinds 2014 gevierd op de verjaardag van staatshoofd Willem-Alexander, 27 april" v_day := '2704'; o_holiday_type := 'King''s Day'; end if; o_date := to_date(v_day || trim(p_year), 'DDMMYYYY'); if to_char(o_date, 'dy', 'nls_date_language=dutch') = 'zo' then if p_year < 1949 then null; elsif p_year < 1980 then -- "Wanneer 30 april op een zondag viel, werd Koninginnedag één dag verschoven; tot 1980 werd hij dan op maandag 1 mei (de Dag van de Arbeid) gevierd." o_date := to_date('0105' || trim(p_year), 'DDMMYYYY'); else -- "Vanaf 1980 werd Koninginnedag en Koningsdag in zulke gevallen een dag vervroegd, dus naar de zaterdag." o_date := o_date - 1; end if; end if; end get_kingsday; function is_holiday ( p_date in date ) return boolean is v_dummy_number number; begin if to_char(p_date,'YYYY') not between c_min_startyear and c_max_endyear then raise_application_error(-20000, 'p_year must be between '||to_char(c_min_startyear,'fm')||' and '||to_char(c_max_endyear,'fm')); end if; -- check if the ted_holidays table is filled select count(*) into v_dummy_number from ted_holidays where rownum = 1 ; if v_dummy_number = 0 then raise_application_error(-20000, 'table ted_holidays is empty'); end if; select count(*) into v_dummy_number from ted_holidays where holiday_date = trunc(p_date) ; if v_dummy_number = 0 then return false; else return true; end if; end is_holiday; function days_between_dates ( p_date_1 in date , p_date_2 in date , p_freedays_free_yn in varchar2 , p_saturdays_free_yn in varchar2 , p_sundays_free_yn in varchar2 ) return pls_integer is -- returns the number of days between two dates, optionally not counting the number of free days, saturdays and/or sundays -- this can be used to determine the number of business days between two dates, for example v_dummy_number pls_integer; v_date_1 date; v_date_2 date; v_freedays_free_yn varchar(1); v_saturdays_free_yn varchar2(1); v_sundays_free_yn varchar2(1); result pls_integer; begin -- check parameters if to_char(p_date_1,'YYYY') not between c_min_startyear and c_max_endyear or to_char(p_date_2,'YYYY') not between c_min_startyear and c_max_endyear or p_date_1 is null or p_date_2 is null then raise_application_error(-20000, 'p_year must be between '||to_char(c_min_startyear,'fm')||' and '||to_char(c_max_endyear,'fm')); end if; -- if p_date_1 > p_date_2 then raise_application_error(-20000, 'p_date_1 must be before (or equal to) p_date_2'); end if; v_freedays_free_yn := upper(p_freedays_free_yn); v_saturdays_free_yn := upper(p_saturdays_free_yn); v_sundays_free_yn := upper(p_sundays_free_yn); if nvl(v_freedays_free_yn, 'x') not in ('Y','N') or nvl(v_saturdays_free_yn, 'x') not in ('Y','N') or nvl(v_sundays_free_yn, 'x') not in ('Y','N') then raise_application_error(-20000, 'p_freedays_free_yn, p_saturdays_free_yn and p_sundays_free_yn must be Y or N'); end if; v_date_1 := p_date_1; v_date_2 := p_date_2; -- 'dumb' difference result := trunc(v_date_2)-trunc(v_date_1); -- remove the free days, saturdays and/or sundays, if needed if v_freedays_free_yn = 'Y' or p_saturdays_free_yn = 'Y' or p_sundays_free_yn = 'Y' then v_dummy_number := 0; begin select nvl(sum(nvl(n,0)),0) into v_dummy_number from ( select day_name , count(*) as n from ( select a.holiday_date , decode(f.holiday_date,null,'N','Y') as holiday_yn , trim(to_char(a.holiday_date,'DY','NLS_LANGUAGE=English')) as day_name from ( select v_date_1 + (d1.c-1)+(d2.c-1)*100 as holiday_date from ( select c from ( select rownum as c from dual connect by level <= 100) where c >= 1 ) d1 , ( select c from ( select rownum as c from dual connect by level <= 100) where c >= 1 ) d2 ) a , ted_holidays f where a.holiday_date < v_date_2 and a.holiday_date = f.holiday_date (+) ) where ( (v_saturdays_free_yn = 'Y' and day_name = 'SAT') or (v_sundays_free_yn = 'Y' and day_name = 'SUN') or (v_freedays_free_yn = 'Y' and holiday_yn = 'Y' ) ) group by day_name ) ; exception when no_data_found then null; when others then raise; end; result := result - v_dummy_number; end if; return result; end days_between_dates; procedure fill_table is v_easter_1 date; begin delete from ted_holidays; /* Wikipedia: De algemeen erkende feestdagen in Nederland zijn aangewezen in de Algemene termijnenwet en andere wetten. Het zijn vrijwel allemaal christelijke feestdagen: - Nieuwjaarsdag - 1 januari - De dag na de dag van de op een BES-eiland gehouden carnavalsoptocht (alleen het betreffende BES-eiland) - Goede Vrijdag - kruisiging van Jezus (geen algemeen erkende feestdag maar vaak gelijkgesteld) - Eerste en tweede Paasdag - Dag van de Arbeid - 1 mei (alleen BES-eilanden) - Hemelvaartsdag - 39 dagen na Pasen - Eerste Pinksterdag (Pinksterzondag) - 49 dagen na Pasen - Tweede Pinksterdag (Pinkstermaandag) - 50 dagen na Pasen (alleen Europees Nederland) - Dia di Himno y Bandera - 6 september (alleen Bonaire) - Statia Day - 16 november (alleen Sint Eustatius) - Saba Day - eerste vrijdag van december (alleen Saba) - Aruba Day - 18 maart(alleen Aruba) - Eerste en tweede Kerstdag - 25 en 26 december De meeste mensen hebben deze dagen vrij, behalve op Goede Vrijdag en Bevrijdingsdag. Goede Vrijdag is soms een (verplichte) vrije dag, afhankelijk van de levensbeschouwelijke inslag van de werkgever. Normaal wordt ervan uitgegaan dat de werknemer om 15 uur, het uur waarop Jezus volgens de christelijke overleveringen aan het kruis gestorven is, in zijn of haar parochiekerk aanwezig kan zijn. Wat betreft de loonberekening zijn erkende feestdagen in de arbeidsvoorwaarden meestal gelijkgesteld met zondagen. De zondagstoeslag geldt dan ook voor deze aangewezen feestdagen. Algemeen erkende feestdagen In het eerste lid van artikel 3 van Algemene termijnenwet worden de volgende dagen als algemeen erkende feestdagen aangemerkt: - Nieuwjaarsdag - Tweede Paasdag - Hemelvaartsdag - Tweede Pinksterdag - Koningsdag - Bevrijdingsdag - Beide kerstdagen Goede Vrijdag is in Nederland geen algemeen erkende feestdag. Het tweede lid van artikel 3 stelt Goede Vrijdag gelijk aan een algemeen erkende feestdag en ingevolge het derde lid kunnen dagen per ministerieel besluit gelijkgesteld worden met een algemeen erkende feestdag. Na de bevrijding in 1945 werd bepaald dat Bevrijdingsdag om de vijf jaren gevierd zou worden. Pas in 1990 werd de datum van 5 mei uitgeroepen tot een nationale feestdag, waarop jaarlijks de bevrijding van het Nederlandse koninkrijk in 1945 van de Duitse en Japanse bezetting wordt herdacht en gevierd. In 1999 werd 15 augustus, de dag van de Japanse capitulatie in 1945, tevens een dag waarop uitgebreid gevlagd mag worden. De datum van 5 mei als nationale feestdag is ook vastgelegd in de Algemene Termijnenwet. Eén en ander betekent echter niet dat 5 mei automatisch een vrije dag is. De Nederlandse regering heeft bepaald dat werknemers en werkgevers zelf een regeling moeten treffen. Dit is terug te vinden in Staatscourant 190, 1 oktober 1990. Werknemers in het bedrijfsleven hebben op 5 mei een vrije dag als dit in de cao is afgesproken. Als dit niet is afgesproken of als de bedrijfstak geen cao heeft, beslist de werkgever over wel of geen betaald vrij. Personeel in (rijks)overheidsdienst heeft, voor zover dit in de cao is opgenomen en de dienst het toelaat, op 5 mei een vrije dag. Semi-overheden volgen dit voorbeeld zo veel mogelijk. */ for y in c_min_startyear..c_max_endyear loop v_easter_1 := get_easter(y); -- New Years Day insert into ted_holidays (holiday_date, holiday_type) values (to_date('01-01'||to_char(y,'0000'),'DD-MM-YYYY'), 'New Years Day') ; -- Easter Sunday insert into ted_holidays (holiday_date, holiday_type) values (v_easter_1, 'Easter Sunday') ; -- Easter Monday insert into ted_holidays (holiday_date, holiday_type) values (v_easter_1 + 1, 'Easter Monday') ; -- Ascension Day insert into ted_holidays (holiday_date, holiday_type) values (v_easter_1 + 39, 'Ascension Day') ; -- Whit Sunday insert into ted_holidays (holiday_date, holiday_type) values (v_easter_1 + 49, 'Whit Sunday') ; -- Whit Monday insert into ted_holidays (holiday_date, holiday_type) values (v_easter_1 + 50, 'Whit Monday') ; -- King's Day declare v_holiday_date date; v_holiday_type varchar2(100); begin get_kingsday ( p_year => y , o_date => v_holiday_date , o_holiday_type => v_holiday_type ) ; if v_holiday_date is not null then insert into ted_holidays (holiday_date, holiday_type) values (v_holiday_date, v_holiday_type) ; end if; end; -- Christmas Day insert into ted_holidays (holiday_date, holiday_type) values (to_date('25-12'||to_char(y,'0000'),'DD-MM-YYYY'),'Christmas Day') ; -- Second Day of Christmas insert into ted_holidays (holiday_date, holiday_type) values (to_date('26-12'||to_char(y,'0000'),'DD-MM-YYYY'),'Second Day of Christmas') ; end loop; end fill_table; end ted_holiday;