Dni ustawowo wolne od pracy w tabeli dat Power BI

Jedna rzecz, która jest mega przydatna w pracy na czasie jest określenie dni wolnych od pracy. Power BI tutaj nie daje nam prostej możliwości ich określenia, dlatego musimy sami trochę pokombinować.

Jak zawsze mamy kilka możliwości, aby do naszego kalendarza dołączyć kolumnę, która wskaże nam, które dni są dniami ustawowo wolnymi.

Możemy skorzystać z połączenia przez API, aby pobrać te dane z zewnętrznych źródeł. I jest to rozwiązanie proste i przyjemne ale z drugiej strony uzależniające nas od zewnętrznego serwisu. A ten może działać, może przestać działać, może wprowadzić zmiany do API… Czyli może być różnie.

Możesz też samodzielnie napisać kilka linijek DAXu i zrobić właściwe obliczenia 🙂

Więc zajmijmy się dzisiaj tą drugą opcją – do roboty!

Dni wolne od pracy w Polsce

Aby prawidłowo oznaczyć w kalendarzu dni wolne od pracy musimy najpierw dowiedzieć się – kiedy one występują.

Zaglądamy do ustawy o dniach wolnych od pracy i widzimy tam:

  • niedziele
  • 1 stycznia
  • 6 stycznia
  • pierwszy dzień Wielkiej Nocy
  • drugi dzień Wielkiej Nocy
  • 1 maja
  • 3 maja
  • pierwszy dzień Zielonych Świątek
  • dzień Bożego Ciała
  • 15 sierpnia
  • 1 listopada
  • 11 listopada
  • 25 grudnia
  • 26 grudnia

No i na pierwszy rzut oka sprawa wydaje się prosta – wystarczy, że stworzymy sobie kolumnę w której za pomocą prostego IF() lub SWITCH() oznaczymy te dni.

Niestety. Tak prosto nam nie pójdzie. Zauważ, że niektóre z tych dni nie mają podanej daty. Dzieje się tak dlatego, że są to święta ruchome – które przypadają w różnych datach.

Przyjrzyjmy się im bliżej.

Święta ruchome w Polsce

Wielkanoc

No i tutaj jest pies pogrzebany, ponieważ daty pozostałych świąt ruchomych oparte są właśnie na Wielkiej Nocy. A wyznaczenie prawidłowej daty tego święta wcale nie jest taką prostą sprawą.

Pozwól, że zacytuję tutaj wikipedię:

W kościołach zachodnich Wielkanoc przypada w pierwszą niedzielę po pierwszej wiosennej pełni Księżyca (tzw. paschalna pełnia Księżyca), przypadającej po 21 marca. Oznacza to, że Wielkanoc wypada pomiędzy 22 marca a 25 kwietnia (włącznie). Daty kościelnej pełni Księżyca zostały wyznaczone i stabelaryzowane w czasie Soboru Nicejskiego w 325 roku n.e. Tym samym kościelna pełnia Księżyca różni się od astronomicznej, wyliczanej dzisiaj według obserwacji.

Wikipedia

Fajnie, nie? Na szczęście nie musimy tutaj robić doktoratu z astronomii a możemy wykorzystać gotowe wzory na obliczenie daty tego święta co też wykorzystamy.

Ale tutaj znowu jest pewna zagwozdka, ponieważ mamy do dyspozycji kilka wzorów. Ja wykorzystuję w tym celu metodę Meeusa/Jonesa/Butchera. I znowu posługując się Wikipedią:

  1. Dzielimy liczbę roku na 19 i wyznaczamy resztę a.
  2. Dzielimy liczbę roku przez 100, wynik zaokrąglamy w dół (odcinamy część ułamkową) i otrzymujemy liczbę b.
  3. Dzielimy liczbę roku przez 100 i otrzymujemy resztę c.
  4. Liczymy: b : 4 i wynik zaokrąglamy w dół i otrzymujemy liczbę d.
  5. Liczymy: b : 4 i wyznaczamy resztę e.
  6. Liczymy: (b + 8) : 25 i wynik zaokrąglamy w dół i otrzymujemy liczbę f.
  7. Liczymy: (b – f + 1) : 3 i wynik zaokrąglamy w dół i otrzymujemy liczbę g.
  8. Liczymy: (19 × a + b – d – g + 15) : 30 i wyznaczamy resztę h.
  9. Liczymy: c : 4 i wynik zaokrąglamy w dół i otrzymujemy cyfrę i.
  10. Liczymy: c : 4 i wyznaczamy resztę k.
  11. Liczymy: (32 + 2 × e + 2 × i – h – k) : 7 i otrzymujemy resztę l.
  12. Liczymy: (a + 11 × h + 22 × l) : 451 i wynik zaokrąglamy w dół i otrzymujemy liczbę m.
  13. Liczymy: (h + l – 7 × m + 114) : 31 i otrzymujemy resztę p.
  14. Dzień Wielkanocy = p + 1.
  15. Miesiąc = Zaokrąglenie w dół dzielenia (h + l – 7 × m + 114) przez 31.

Powyższe kroki będziemy musieli przełożyć na DAX.

Pierwszy dzień Zielonych Świątek

Przypada zawsze 49 dni od Wielkiej Nocy – czyli również w niedziele. Dlatego nawet nie musimy tutaj nic szczególnego obliczać.

Dzień Bożego Ciała

Tutaj też sprawa jest prosta – przypada zawsze 60 dni po Wielkiej Nocy.

Tworzymy kolumnę dni wolnych

Naszym celem jest dodanie kolumny do naszego kalendarza która w sposób jednoznaczny określi nam czy dany dzień jest dniem wolnym od pracy. Czyli będziemy musieli sprawdzić, które z dat spełniają określone warunki.

DniWolne =
VAR __Rok = 'Kalendarz DAX'[Rok]
VAR __a = MOD ( __Rok, 19 )
VAR __b = ROUNDDOWN ( DIVIDE ( __Rok, 100 ), 0 )
VAR __c = MOD ( __Rok, 100 )
VAR __d = ROUNDDOWN ( DIVIDE ( __b, 4 ), 0 )
VAR __e = MOD ( __b, 4 )
VAR __f = ROUNDDOWN ( DIVIDE ( __b + 8, 25 ), 0 )
VAR __g = ROUNDDOWN ( DIVIDE ( __b - __f + 1, 3 ), 0 )
VAR __h = MOD ( 19 * __a + __b - __d - __g + 15, 30 )
VAR __i = ROUNDDOWN ( DIVIDE ( __c, 4 ), 0 )
VAR __k = MOD ( __c, 4 )
VAR __l = MOD ( 32 + 2 * __e + 2 * __i - __h - __k, 7 )
VAR __m = ROUNDDOWN ( DIVIDE ( __a + 11 * __h + 22 * __l, 451 ), 0 )
VAR __p = MOD ( __h + __l - 7 * __m + 114, 31 )
VAR __DzienWN = __p + 1 // dzień w którym przypada Wielkanoc
VAR __MiesiacWN = ROUNDDOWN ( DIVIDE ( __h + __l - 7 * __m + 114, 31 ), 0 ) // miesiąc w którym przypada Wielkanoc
VAR __Wielkanoc = DATE ( __Rok, __MiesiacWN, __DzienWN ) // Pełna data - Wielkanoc
VAR __WielkanocPN = 'Kalendarz DAX'[Date] = DATE ( __Rok, __MiesiacWN, __DzienWN + 1 ) // poniedziałek wielkanocny
VAR __BozeCialo = IF ( DATEADD ( 'Kalendarz DAX'[Date], -60, DAY ) = __Wielkanoc, TRUE () ) // Boże Ciało
RETURN
/* określamy, przy których dniach w kalendarzu ma pojawić się wartość "TAK" w naszej kolumnie */
    SWITCH (
        TRUE (),
            'Kalendarz DAX'[Dzień tygodnia] IN { 6, 7 } // Soboty i niedziele
            || 'Kalendarz DAX'[Dzień Miesiąca] IN { 1, 6 }  'Kalendarz DAX'[Miesiąc] = 1 //  1 i 6 stycznia
            || 'Kalendarz DAX'[Dzień Miesiąca] IN { 1, 3 } && 'Kalendarz DAX'[Miesiąc] = 5 // 1 i 3 maja
            || 'Kalendarz DAX'[Dzień Miesiąca] = 15 && 'Kalendarz DAX'[Miesiąc] = 8 // 15 sierpnia
            || 'Kalendarz DAX'[Dzień Miesiąca] IN { 1, 11 } && 'Kalendarz DAX'[Miesiąc] = 11 // 1 i 11 listopada
            || 'Kalendarz DAX'[Dzień Miesiąca] IN { 25, 26 } && 'Kalendarz DAX'[Miesiąc] = 12 // 25 i 26 grudnia
            || __WielkanocPN // poniedziałek wielkanocny
            || __BozeCialo, // Boże ciało
            "TAK"
    )

I gotowe. W kalendarzu właśnie pojawiła się nowa kolumna, w której przy każdym oznaczonym dniu wolnym pojawia się string „TAK”.

Możesz oczywiście dostosować kolumnę do własnych potrzeb i usunąć z niej chociażby soboty.

Czy to było przydante?

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Join Us!

Custom Sidebar

You can set categories/tags/taxonomies to use the global sidebar, a specific existing sidebar or create a brand new one.