Blog JSystems - uwalniamy wiedzę!

Szukaj

Power Query w Power BI

Odświeżanie w usłudze Power BI przesuwa daty o godzinę - DateTime.LocalNow i UTC

W skrócie

  • Po publikacji raportu w usłudze Power BI czas odświeżenia liczony przez DateTime.LocalNow pokazuje godzinę albo dwie mniej, a filtr na dzień bieżący tuż po północy wciąż zwraca poprzedni dzień.
  • Zapytania odświeżane w usłudze Power BI i w Fabric działają na maszynach w chmurze ustawionych na UTC, więc DateTime.LocalNow zwraca tam czas UTC. Polska ma przesunięcie +1 zimą i +2 latem.
  • Bierz czas z DateTimeZone.FixedUtcNow i przeliczaj go na czas polski funkcją, która uwzględnia zmianę czasu, albo przekazuj datę raportu w parametrze. Funkcję sprawdź na granicach zmiany czasu.

Raport w Power BI Desktop pokazuje poprawną datę, a po publikacji i odświeżeniu w usłudze jest przesunięty: czas ostatniego odświeżenia jest o godzinę wcześniejszy, a raport z dnia bieżącego tuż po północy wciąż liczy wczoraj. Przyczyną jest DateTime.LocalNow, który w usłudze Power BI zwraca czas UTC. Pokazujemy, skąd się to bierze, jak liczyć czas polski z uwzględnieniem zmiany czasu i jak to sprawdzić.

Jak to wygląda w praktyce

Typowe zapytanie z filtrem na dzień bieżący zawiera kroki w rodzaju:

Dzisiaj = DateTime.Date(DateTime.LocalNow()),
Filtr = Table.SelectRows(Sprzedaz, each [Data] = Dzisiaj)

W Power BI Desktop na komputerze w Polsce dzień jest liczony poprawnie. Po publikacji ta sama formuła w usłudze liczy dzień w czasie UTC, więc zimą między północą a 1:00, a latem między północą a 2:00 zwraca poprzedni dzień. W naszym teście chwila 06.10.2026 22:30 UTC dała w UTC datę 6 października, a w czasie polskim było już 7 października. Kolumna albo karta z czasem odświeżenia liczona przez DateTime.LocalNow() pokazuje w usłudze godzinę o 1 albo 2 mniejszą niż zegar w Polsce. Harmonogram ustawiony na wczesne godziny nocne trafia dokładnie w to okno.

Dlaczego tak się dzieje

Dokumentacja Microsoft opisuje to wprost: Power Query Online zawsze zwraca czas UTC, nawet gdy funkcja ma w nazwie Local. Opis funkcji DateTime.LocalNow w samym Power Query podaje powód: zapytanie uruchomione w chmurze odczytuje czas maszyn wirtualnych, które są ustawione na UTC. Tak samo zachowują się DateTime.FixedLocalNow, DateTimeZone.LocalNow i DateTimeZone.FixedLocalNow, a DateTimeZone.ToLocal w Power Query Online także zwraca czas UTC. Dotyczy to odświeżania w usłudze Power BI i przepływów Dataflow Gen2 w Fabric.

Polska ma zimą przesunięcie UTC+1, a latem UTC+2, dlatego rozjazd wynosi godzinę albo dwie, zależnie od pory roku. Dokumentacja zwraca uwagę, że różnice najbardziej widać przy granicach: tuż przed północą i tuż po niej, na początku miesiąca i roku. Strefa czasowa w harmonogramie odświeżania ustala, o której godzinie odświeżanie się uruchomi, ale nie zmienia wyniku funkcji, które w chmurze zwracają UTC.

Formularz harmonogramu odświeżania przepływu Dataflow Gen2 w Microsoft Fabric z porą dnia 06:00 i strefą czasową UTC+01:00 z Warszawą
Formularz harmonogramu odświeżania w Fabric: cykl Codziennie, pora dnia 06:00, data rozpoczęcia i strefa czasowa (UTC+01:00) z Warszawą.

Jak to rozwiązać krok po kroku

  1. Znajdź wszystkie miejsca z czasem bieżącym. W edytorze Power Query otwórz Edytor zaawansowany w każdym zapytaniu i wyszukaj LocalNow, FixedLocalNow i ToLocal.
  2. Utwórz puste zapytanie, otwórz w nim Edytor zaawansowany, wklej funkcję poniżej i nazwij zapytanie CzasPolski. Funkcja przelicza czas UTC na polski: przesunięcie +2 obowiązuje od ostatniej niedzieli marca do ostatniej niedzieli października, w obu przypadkach od 1:00 UTC. Date.StartOfWeek(#date(rok, 3, 31), Day.Sunday) zwraca niedzielę, od której zaczyna się tydzień z 31 marca, czyli ostatnią niedzielę marca.
    (utc as datetimezone) as datetimezone =>
    let
        u = DateTimeZone.RemoveZone(DateTimeZone.SwitchZone(utc, 0)),
        rok = Date.Year(u),
        startLata = DateTime.From(Date.StartOfWeek(#date(rok, 3, 31), Day.Sunday)) + #duration(0, 1, 0, 0),
        koniecLata = DateTime.From(Date.StartOfWeek(#date(rok, 10, 31), Day.Sunday)) + #duration(0, 1, 0, 0),
        przesuniecie = if u >= startLata and u < koniecLata then 2 else 1
    in
        DateTimeZone.SwitchZone(utc, przesuniecie)
  3. W zapytaniu raportu zastąp czas lokalny wywołaniem funkcji:
    Teraz = CzasPolski(DateTimeZone.FixedUtcNow()),
    Dzisiaj = DateTime.Date(Teraz),
    Filtr = Table.SelectRows(Sprzedaz, each [Data] = Dzisiaj)
    DateTimeZone.FixedUtcNow zwraca czas UTC zarówno w Power BI Desktop, jak i w usłudze, i jedną wartość przez całe obliczenie zapytania, więc wszystkie kroki widzą tę samą chwilę.
  4. Czas odświeżenia do karty w raporcie licz tak samo: DateTimeZone.RemoveZone(CzasPolski(DateTimeZone.FixedUtcNow())) daje datę i godzinę w czasie polskim z typem Data/godzina, bez strefy.
  5. Gdy raport ma pokazywać dzień wybrany przez człowieka, a nie dzień odświeżenia, użyj parametru. W edytorze kliknij Zarządzaj parametrami, potem Nowy, ustaw typ Data i wpisz datę raportu, a w filtrze porównuj kolumnę z tym parametrem zamiast z funkcją czasu bieżącego.
  6. Jeśli wolisz zostać przy UTC, licz w UTC wszystko: daty w danych, filtr dnia i znacznik odświeżenia. Dokumentacja Microsoft zaleca UTC dla zaplanowanych odświeżeń jako najbardziej przewidywalne, a przeliczenie na czas polski zostawiasz wtedy tylko do wyświetlania.

Jak sprawdzić, że zadziałało

Sprawdź funkcję na chwilach wpisanych ręcznie, zanim opublikujesz raport, na przykład CzasPolski(#datetimezone(2026, 10, 6, 22, 30, 0, 0, 0)). W naszym teście w polskim Excelu dała ona:

  • 06.10.2026 22:30 UTC: 07.10.2026 00:30 +02:00, czyli już następny dzień,
  • 29.03.2026 0:59 UTC: 01:59 +01:00, a minutę później 03:00 +02:00,
  • 25.10.2026 0:59 UTC: 02:59 +02:00, a minutę później 02:00 +01:00,
  • 31.12.2026 23:30 UTC: 01.01.2027 00:30 +01:00.

Wszystkie wyniki zgodziły się z przeliczeniem, które ten sam Excel wykonał funkcją DateTimeZone.ToLocal według strefy czasowej Windows (UTC+1 z czasem letnim), także na granicach zmiany czasu w 2027 roku. Po publikacji odśwież model w usłudze i porównaj czas odświeżenia na karcie z zegarem. Żeby problem nie wrócił, w zapytaniach odświeżanych w chmurze nie używaj funkcji z Local w nazwie, a przeliczenie trzymaj w jednej funkcji, z której korzystają wszystkie zapytania.

Wróć do listy: 88 najczęstszych pytań i problemów związanych z Power Query

Baner szkolenia Kompleksowe szkolenie Power BI - Desktop, DAX i Online + Copilot w JSystems

Szkolenie Power BI - Desktop, DAX i Online --> Pięć dni od pierwszego raportu do publikacji w usłudze Power BI: Power Query, model danych z wielu tabel, DAX, wizualizacje i Copilot. To szkolenie ma terminy gwarantowane.

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Dlaczego DateTime.LocalNow w usłudze Power BI zwraca czas UTC?
Zapytania odświeżane w chmurze działają na maszynach wirtualnych ustawionych na UTC, a DateTime.LocalNow zwraca czas systemu, na którym działa zapytanie. Opis funkcji w Power Query mówi wprost, że Power Query Online zwraca w takim przypadku czas UTC. W Power BI Desktop ta sama funkcja zwraca czas Twojego komputera.
Czy wystarczy dodać 2 godziny do czasu UTC?
Tylko latem. Polska ma zimą przesunięcie +1, a latem +2, więc stała wartość daje błędny wynik przez około pół roku. Przesunięcie trzeba wyliczać z daty, na przykład funkcją, która sprawdza ostatnią niedzielę marca i października.
Czy strefa czasowa ustawiona w harmonogramie odświeżania rozwiązuje problem?
Nie. Strefa w harmonogramie określa, o której godzinie odświeżanie się uruchomi. Funkcje czasu lokalnego w chmurze i tak zwracają czas UTC, bo według dokumentacji Microsoft Power Query Online zawsze zwraca czas UTC, także w funkcjach z Local w nazwie.
Czym różni się DateTimeZone.UtcNow od DateTimeZone.FixedUtcNow?
Obie zwracają czas UTC w Power BI Desktop i w usłudze. UtcNow może zwrócić inną wartość przy każdym wywołaniu w trakcie odświeżania, a FixedUtcNow jedną wartość przez całe obliczenie zapytania. Do filtra na dzień bieżący i znacznika odświeżenia lepiej pasuje wersja Fixed, bo wszystkie kroki widzą tę samą chwilę.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...