Berechnung von Arbeitstagen in Zeitintervallen-Nutzer-definierte Funktionen mit PROC FCMP vs. Macro Lösung Thomas Grobe ZIEL: In Datentabellen mit Angaben zu vielen Zeitintervallen – jeweils definiert durch ein VON- und BIS-Datum – soll die Anzahl der regulären Arbeitstage (RA) in den Intervallen ermittelt werden. UMSETZUNG: Werden als RA zunächst alle Kalendertage von Montag bis Freitag angesehen, lässt sich eine Ermittlung der RA relativ einfach mit der SAS-Funktion INTCK und ‘WEEKDAY17W‘ als IntervallSpezifikation realisieren. Durch Veränderungen der Intervall-Spezifikation können mit INTCK sehr flexibel auch andere Wochentage im Sinne von RA gezählt werden (in einem eher ungewöhnlichen Beispiel bei Angabe von ‘WEEKDAY234567W‘ z.B. nur noch alle Sonntage). Nicht von einer Zählung ausschließen lassen sich mit INTCK allerdings die typischerweise national unterschiedlich festgelegten Feiertage. Zur Ermittlung von RA mit Berücksichtigung von Feiertagen findet sich gut dokumentierter SASProgrammcode von C. Hemedinger (1) im Internet, mit dem unter Rückgriff auf PROC FCMP eine hierzu geeignete Nutzer-definierte Funktion generiert wird. Alle für die Berechnung relevanten Feiertage müssen vor Funktionsaufruf in einer Tabelle gelistet sein (im Beispiel US-amerikanische Feiertage des Jahres 2010), sie werden bei Funktionsaufruf in ein Array eingelesen. Der zitierte Programmcode wurde modifiziert und um eine optionale Berücksichtigung regionalspezifischer Feiertage erweitert. Zudem wurde ein Makro entwickelt, welches für beliebige Jahre die z.Z. in Deutschland einheitlich sowie die in einzelnen Bundesländern (BL) gültigen Feiertage ermittelt und in Tabellen bereitstellt. Tests der neuen Nutzer-definierten Funktionen zeigten allerdings Laufzeiten, die bei der Verarbeitung großer Datentabellen mit vielen Mio. Beobachtungen nur eingeschränkt akzeptabel wären (18,6 bzw. 55 Sekunden für 100.000 Intervalle, ohne bzw. mit Berücksichtigung BL-spezifischer Feiertage). Vor diesem Hintergrund wurde ein SAS-Makro entwickelt, welches als Alternative für die Nutzerdefinierten Funktionen bei identischen Daten identische Ergebnisse liefert. Informationen zu Feiertagen werden dabei innerhalb von PROC SQL in nummerierten Makro-Variablen abgelegt (Bsp.: select dat into :AD1 - :AD&NA.), die anschließend in Makro-Schleifen angesprochen werden können (Bsp.: %DO Z=1 %TO &NA.; if &&AD&Z. = .... ). Die Laufzeiten der Makro-Lösung erwiesen sich als erheblich kürzer (0,06 bzw. 0,08 Sekunden für 100.000 Intervalle, ohne bzw. mit Berücksichtigung BLspezifischer Feiertage). FAZIT: Viele Wege führen zum Ziel – manche im Einzelfall erheblich schneller.