,

Nettoarbeitstage mit DAX berechnen

Wenn man zwischen zwei Datumsangaben die Anzahl der reinen Arbeitstage berechnen will, so gibt es in Excel die Funktion NETTOARBEITSTAGE (bzw. auch NETTOARBEITSTAGE.INTL).
Eine vergleichbare Funktion hat man in Power BI bisher vermisst. In diesem Beitrag habe ich beschrieben, wie ich hierfür bisher eine von Imke Feldmann bereitgestellte PowerQuery-Funktion verwendet habe.

Mit dem Juli/2022 – Update von Power BI Desktop stellt Microsoft nun die neue Funktion NETWORKDAYS für diesen Anwendungsfall zur Verfügung.

Wenn man in Excel bereits die Funktion NETWORKDAYS.INTL verwendet hat, ist die neue DAX-Funktion sehr intuitiv.
Ich beschreibe die Anwendung im Folgenden an einem einfachen Beispiel.

Das Beispiel

Nehmen wir an, in einem Produktionsbetrieb gilt die Regel, dass zwischen dem Auftrags-Start an der Maschine und dem Auftrags-Ende maximal drei Arbeitstage vergehen dürfen.
Wir können, um das zu überprüfen, also nicht einfach die Anzahl der vergangenen Tage zählen. Es können zwischen Auftrags-Start und Auftrags-Ende Wochenenden fallen, Feiertage (wobei diese noch in jedem Bundesland anders sind) und es können auch Betriebsschließtage in diesen Zeitraum fallen.

In unserem Beispiel ist der Auftrags-Start der 03.06.2022. Das Auftragsende ist der 07.06.2022.
Da die Auftragslage gut ist, gilt in dieser Firma die 6-Tage-Woche, das heißt, nur am Sonntag wird nicht gearbeitet.

Wenn wir in den Kalender schauen, sehen wir, dass der 6. Juni 2022 Pfingstmontag war. An diesem Tag stand die Produktion still.

Wie viele Arbeitstage sind in diesem Beispiel nun vergangen?

Feier- und Schließtage definieren

Ich halte es so, dass ich immer zum Jahresanfang die Feier- und Betriebsschließtage in einer csv-Datei zusammentrage.
Die Datei trägt den Namen schliesstage.csv und sie hat nur eine einzige Spalte mit der Spaltenüberschrift „schliesstage“.
In diese Spalte trage ich jeden einzelnen Schließtag ein – also Feiertage, Betriebsurlaube, Brückentage usw.

Denkbar wäre natürlich auch, die Feiertage in einer Datei „feiertage.csv“ und die Betriebsschließtage in einer Datei „betriebsschliesstage.csv“ zu definieren und diese Dateien beim Laden ins Modell dann zusammenzuführen – aber darum soll es hier nicht gehen.

Die neue DAX-Funktion NETWORKDAYS

Die Funktion NETWORKDAYS nimmt vier Parameter entgegen, wobei Parameter 3 und 4 optional sind.

Der erste Parameter ist das Startdatum. Dieses kann mit der DATE-Funktion angegeben werden oder als Ausdruck. Auch ein Literal ist möglich in der Form (dt“2022-06-03″).

Der zweite Parameter ist das Enddatum, für das die gleichen Regeln gelten, wie für das Startdatum.
Das Enddatum kann theoretisch auch vor dem Startdatum liegen, dann bekommt man negative Zeiten.

Der dritte Parameter definiert das Wochenende, Der Standard (1) ist, dass das Wochenende aus Samstag und Sonntag besteht. Gibt man den Parameter nicht an, wird dieses Standardverhalten angewendet.
Gibt man hier z.B. 2 ein, ist das Wochenende Sonntag und Montag. In unserem Beispiel verwenden wir den Parameter 11, was „nur Sonntag“ entspricht. Die genaue Liste aller möglichen Parameter könnt Ihr der offiziellen Microsoft-Dokumentation entnehmen, die ich unten verlinke.

Der vierte (ebenfalls optionale) Parameter ist eine Spaltentabelle mit einem oder mehreren Datumsangaben, die ebenfalls aus der Berechnung ausgeschlossen werden.
Im Beispiel verwende ich hier die Tabelle „schliesstage“ mit der einzigen Spalte „schliesstage“.

Nun erstelle ich in meinem Beispiel in diesem Fall eine berechnete Spalte. Natürlich wäre es auch möglich, ein Measure zu erstellen.

Nettoarbeitstage = 
NETWORKDAYS (
    auftragsdaten[Auftrag Start],
    auftragsdaten[Auftrag Ende],
    11,
    schliesstage
)

Die Nettoarbeitstage pro Zeile berechnet sich nun wie folgt:

  • als ersten Parameter übergebe ich die Spalte aus der Tabelle „auftragsdaten“, in der das Startdatum gespeichert ist
  • als zweiten Parameter übergebe ich aus derselben Tabelle das Ende-Datum
  • als dritten Parameter gebe ich 11 an, was „nur Sonntag“ entspricht
  • als vierten Parameter übergebe ich die Tabelle „schliesstage“. In dieser Tabelle ist auch der Pfingstmontag, also der 06.06.2022 enthalten

Wenn wir das nun alles in einer Tabelle darstellen, sehen wir, dass das Ergebnis für die berechneten Nettoarbeitstage 3 ist:

Freitag, der 3. Juni ist der erste Arbeitstag. Da im Beispiel auch am Samstag gearbeitet wird, ist der Samstag der zweite Arbeitstag. Am Sonntag wird nicht gearbeitet (es ist ohnehin Pfingstsonntag). Am Montag, den 6. Juni, ist Pfingstmontag und es wird ebenfalls nicht gearbeitet. Dienstag, der 7. Juni ist schließlich der Arbeitstag Nummer 3.

Zu beachten ist also, dass die Grenzwerte, also hier der 3. Juni und der 7. Juni, mitgezählt werden.
Will man z.B. den Tag des Auftrags-Starts immer ausschließen, müsste man hier also noch -1 rechnen.

Ich bin sehr froh, dass Microsoft die Funktion NETWORKDAYS nun endlich nachgeliefert hat und werde diese intensiv nutzen.

Die offizielle Dokumentation von Microsoft für die neue Funktion findet Ihr hier.

0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert