Dátumové operácie v PowerPivote a Power BI

Dátumové operácie dajú začiatočníkom zabrať, ak chcú robiť výpočty v čase, či už v excelovskom PowerPivote, alebo v Power BI. Niektoré funkcie z Excelu tu fungujú tiež, niektoré identicky, niektoré inak. A potom tu máme špeciálne funkcie, ktoré sú úplne odlišné. Preto sa teraz pozrieme na to, ako robiť najčastejšie dátumové operácie v PowerPivote, či už v Exceli, alebo v Power BI. A ako pomocou nich skrotiť každý dátum.

Zadávanie dátumov

Dátumy nikdy nezadávajte excelovským ani accessovským spôsobom. Čiže napr. v úvodzovkách ako “6. 9. 2018” alebo cez mriežku #6. 9. 2018#. Pretože ak vám to náhodou niekedy aj zbehne, tak to má jeden zásadný problém – nebude vám to fungovať na inom počítači, ak bude mať iné regionálne nastavenia. Namiesto toho používajte funkciu DATE, ktorá je prevzatá z Excelu, a funguje aj tu úplne identicky. Jej syntax je:

DATE(rok; mesiac; deň)

Čiže ak chcete zadať dátum 1. 9. 2018, tak to zadáte napr. do merítka takto:

Dnes := DATE(2018; 9; 1)

Pričom mesiac môže byť zadaný nielen ako číslo od 1 do 12, ale aj väčšie ako 12 (tým pádom sa prehupnete do ďalšieho roka), alebo aj menšie ako 1, aj záporné číslo (tým pádom sa prehupnete do predchádzajúceho roku). Takisto to platí aj pre dni. Príklad viď nižšie, počítanie konca mesiaca.

Dnešný deň, aktuálny čas

Ak chcete zistiť dnešný dátum, tak máte dve funkcie v jazyku DAX, ktorými to pôjde. Prvá sa volá TODAY a vracia len aktuálny dátum bez času. Druhá sa volá NOW a vracia aktuálny dátum aj s časom. Používajú sa veľmi jednoducho:

Dnes := TODAY( )

Dnes := NOW( )

Posúvanie dátumov

Ak chcete zistiť predchádzajúci alebo nasledujúci deň, voči nejakému dátumu už uloženému napr. v merítku, tak použite rovnaký trik ako v Exceli. Pretože na to priamo jazyk DAX nemá žiadne funkcie. Pre zistenie predchádzajúceho dátumu odpočítajte jednotku, pre zistenie nasledujúceho pripočítajte jednotku. Napr. ak sme v hore uvedenom merítku mali uložený nejaký dátum, tak dátum o deň skôr zistíme takto:

Predchádzajúci deň := [Dnes] – 1

Finta spočíva v tom, že dátumy sú v PowerPivote uložené ako desatinné čísla. Tak isto ako v Exceli, v databázach, či čomkoľvek inom. Pričom celá časť čísla reprezentuje dátum (počet dní od nejakého prvotného dátumu, napr. 1. 1. 1900), a desatinná časť reprezentuje čas v rámci toho dňa – ako zlomok z daného dňa. Čiže napr. dátum 6. 9. 2018 je reprezentovaný povedzme ako číslo 48527,0. A dátum s časom – napr. 6. 9. 2018 12:00 – je reprezentovaný ako 48527,5. Preto k nim môžete pripočítavať aj odpočítavať čísla. Je to oficiálny spôsob práce s dátumami, a nie niečo nedokumentované, čo náhodou funguje. Takže to v kľude môžete používať.

Posun na prechádzajúci/nasledujúci pracovný deň

Tomuto sa venuje tento osobitný článok.

Konverzia textového dátumu a času na technický dátum/čas

Ak máte zadaný dátum a čas ako text, tak odporúčam rozbiť si to na jednotlivé zložky v Power Query, a tam si z toho poskladať technický dátum.

Ide to však spraviť aj v PowerPivote, len nemáte v prípade problémov nad tým žiadnu kontrolu. Ale potrebujete mať pripravené dátumy a časy v oddelených stĺpcoch (alebo merítkach, premenných, …). A to najdôležitejšie – potrebujú byť v rovnakom formáte, aký máte nastavený vo svojich regionálnych nastaveniach v počítači. To je ten formát, čo vidíte v pravom dolnom rohu obrazovky, tam kde vidíte dátum a čas. Plus musíte počítať s tým, že keď to prenesiete na iný počítač alebo server, a bude to mať nastavené inak, tak vám to prestane fungovať.

Povedzme, že máte zadaný dátum ako text, konkrétne “6. 9. 2018”. A čas tiež ako text, konkrétne “20:32:54”. Na konverziu textového dátumu na technický dátum použijeme funkciu DATEVALUE takto:

Dátum := DATEVALUE( “6. 9. 2018” )

A v niektorých prípadoch je nutné zadať americký formát dátumu, ktorý však tiež nie je garantovaný:

Dátum := DATEVALUE( “9/6/2018” )

Ak k tomu dátumu chcete pridať aj čas, tak použite funkciu TIMEVALUE, spolu s fintou na spočítavanie dátumových polí, uvedenou vyššie, takto:

Dátum a čas := DATEVALUE( “6. 9. 2018” ) + TIMEVALUE( “20:32:54” )

Rozdiely v dátumoch

Na výpočet rozdielu medzi dvoma dátumami viete použiť funkciu DATEDIFF. Jej syntax je takáto:

DATEDIFF(počiatočnýDátum, koncovýDátum, obdobie)

Táto funkcia spočíta počet období medzi zadanými dvoma dátumami. Pričom obdobie môže byť deň, týždeň mesiac, štvrťrok, rok, hodina, minúta alebo sekunda. Konkrétne hodnoty nájdete v oficiálnej dokumentácii, alebo v roletke pri písaní vzorca.

Ak chcete teda vypočítať počet dní medzi dvoma dátumami, tak použijete nasledovný vzorec. Ja v ňom použijem ručne zadané dátumy, ale funguje to aj s ľubovoľnými inými dátumami. Počet dní medzi 23.8.2018 a 12.9.2018 vypočítame takto:

Počet dní := DATEDIFF(DATE(2018; 8; 23); DATE(2018; 9; 12); DAY)

Počet pracovných dní medzi dvoma dátumami

Tomuto sa venuje tento osobitný článok.

Vytiahnutie zložiek z dátumu

Ak máte už dátum, a potrebujete z neho vytiahnuť rok, mesiac či deň, tak použite funkcie, ktoré fungujú rovnako aj v Exceli – YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, WEEKNUM, WEEKDAY. Napríklad ak máte v hore uvedenom merítku Dnes uložený dátum 1. 9. 2018, tak rok z neho získate takto:

Rok :=YEAR( [Dnes] )

Ak chcete získať štvrťrok, tak použite tento vzorec, ktorým si to odvodíte z čísla mesiaca:

Štvrťrok = CEILING( MONTH( [Dnes] ) / 3; 1)

Začiatok mesiaca, koniec mesiaca

Začiatok mesiaca si viete odvodiť z dátumu použitím už hore uvedených funkcií. Napr. takto:

Začiatok mesiaca := DATE( YEAR( [Dnes] ); MONTH( [Dnes] ); 1)

Analogicky, koniec mesiaca môžete vyskúšať napr. týmto zápisom:

Koniec mesiaca := DATE(YEAR([Dnes]); MONTH([Dnes]) + 1; 1) – 1

Používame fintu, že zistíme prvý deň nasledujúceho mesiaca (funguje aj na prelome rokov), a od neho odpočítame 1 deň podľa už skoršej finty.

Prípadne na to môžete použiť skratkovitú funkciu EOMONTH:

Koniec mesiaca := EOMONTH([Dnes]; 0)

Prvý parameter je dátum, a druhý parameter počet mesiacov po tom dátume, po ktorých sa má nájsť najbližší koniec mesiaca. Keď chceme ten istý mesiac, tak tam zadáme nulu. Ak by ste ale chceli koniec mesiaca o 2 mesiace neskôr, tak tam zadáte 2. Napr. pri výpočte splatnosti pohľadávok, ktoré sú splatné posledný deň v mesiaci, o 2 mesiace po ich vzniku.

Dátum o X mesiacov skôr alebo neskôr

Ak potrebujete vypočítať dátum o X mesiacov skôr alebo o X mesiacov neskôr ako zadaný dátum (napr. pri výpočte dátumu splatnosti presne mesiac po objednaní), tak to viete spraviť minimálne 2 spôsobmi. Buď to viete znova spraviť napr. vyskladaním už hore uvedených funkcií:

Dátum o mesiac := DATE(YEAR([Dnes]); MONTH([Dnes]) + 1; DAY([Dnes]))

…alebo aj skratkovitou funkciou EDATE:

Dátum o mesiac: = EDATE([Dnes]; 1)

Funkcia EDATE má ako prvý parameter dátum, a druhý parameter počet mesiacov. Ten môže byť aj záporný.

Sekvencie v dátumoch

Ak chcete spraviť tabuľku, v ktorej bude stĺpec so postupnosťou dátumov postupne od-do zadaného dátumu, tak si pozrite článok o sekvenčných tabuľkách. Využijete to pri funkciách Time Intelligence, aj pri pokročilých výpočtoch v čase.

Výpočty za časové obdobia

Tomuto sa venuje bližšie článok o funkciách Time Intelligence.


Takže takto sa pracuje s dátumami v PowerPivote aj v Power BI. A ak už viete, ako na to, tak je to veľmi jednoduché 🙂 A ak by vám tu niečo chýbalo, tak dajte vedieť – v rámci možností doplníme.