We did this - easier for operational use in a large org
proc fcmp outlib=nkfnk.funktion.prod;
function bankdag(Dato,forskydning);
length retur 8;
if forskydning = . then forskydning1=0;
else forskydning1=forskydning;
nyDato=Dato + Forskydning1;
aar = year(nyDato);
if weekday(nyDato) = 7 then retur = 6; /* Lørdag */
else if weekday(nyDato) = 1 then retur = 7; /* Søndag */
else if nyDato = mdy(06,05,aar) then retur = 506; /* Grundlovsdag */
else if nyDato = mdy(12,24,aar) then retur = 2412; /* Juleaftensdag */
else if nyDato = mdy(12,25,aar) then retur = 2512; /* 1. Juledag */
else if nyDato = mdy(12,26,aar) then retur = 2612; /* 2. Juledag */
else if nyDato = mdy(01,01,aar) then retur = 101; /* Nytårsdag */
else if nyDato = mdy(12,31,aar) then retur = 3112; /* Nytårsaftensdag */
else do;
paaske=holiday('easter',aar);
if nyDato = paaske-3 then retur = 201; /*"Skærtorsdag"*/
else if nyDato = paaske-2 then retur = 202; /*"Langfredag"*/
else if nyDato = paaske+1 then retur = 203; /*"2.Påskedag"*/
else if nyDato = paaske+26 then retur = 204; /*"Store bededag"*/
else if nyDato = paaske+39 then retur = 205; /*"Kr. himmelfart"*/
else if nyDato = paaske+40 then retur = 206; /*"Fredag efter Kr. himmelfart"*/
else if nyDato = paaske+50 then retur = 207; /*"2. pinsedag"*/
else retur = 1; /*"Bankdag"*/
end;
return(retur);
endsub;
run;quit;
proc format library=nkfmt;
value bankdagf 1 = 'Bankdag'
7 = 'Søndag'
6 = 'Lørdag'
506 = 'Grundlovsdag'
2412 = 'Juleaftensdag'
2512 = 'Juledag'
2612 = '2. Juledag'
101 = 'Nytårsdag'
3112 = 'Nytårsaftensdag'
201 = 'Skærtorsdag'
202 = 'Langfredag'
203 = '2. Påskedag'
204 = 'Store Bededag'
205 = 'Kr Himmelfart'
206 = 'Fredag efter Kr. Himmelfart'
207 = '2. Pinsedag'
other = '***Fejl***';
run;
/* --- Test data --- */
data aar_2014;
format dato ddmmyy10.
type bankdagf.;
do dato='01jan2014'd to '31dec2014'd by 1;
type=bankdag(dato,0);
output;
end;
run;
title "365 dage i 2014 i Danmark";
proc print data=aar_2014;
run;
proc freq data=aar_2014;
table type /nocum;
run;
title "Fridage i 2014 i Danmark";
proc print data=aar_2014;
where bankdag(dato,0) not in(1,6,7);
run;
title;
... View more