Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Komunikaty błędów DAX

Nie można przekonwertować wartości typu Text na typ Date - daty z tekstu w DAX

W skrócie

  • Komunikat DAX „Nie można przekonwertować wartości „2024-13-01” typu Text na typ Date” pojawia się, gdy DATEVALUE dostaje tekst, którego nie umie odczytać jako daty, albo liczbę w rodzaju 20241015.
  • DATEVALUE czyta tekst według ustawień regionalnych modelu, a gdy to się nie uda, próbuje innych formatów. Dlatego część dat z tekstu w układzie miesiąc, dzień zamienia się po cichu, bez żadnego błędu.
  • Daty najlepiej zamieniać w Power Query z podanymi ustawieniami regionalnymi. W DAX buduj datę funkcją DATE z części tekstu albo z klucza liczbowego i sprawdzaj wynik liczeniem zgodnych wierszy.

Tekst „03/04/2024” zapisany w układzie miesiąc/dzień/rok oznacza 4 marca, a DATEVALUE w DAX zamienia go na 3 kwietnia i nie zgłasza żadnego błędu. To cicha postać problemu, którego głośna wersja przerywa kolumnę obliczeniową albo miarę komunikatem, że nie można przekonwertować wartości typu Text na typ Date. Pokazujemy oba przypadki na modelu Nordvelli, jak czytać ustawienia regionalne modelu i które formuły dają daty bez niespodzianek.

Jak to wygląda w praktyce

Silnik przerywa obliczenie komunikatem z wartością, której nie odczytał. Na modelu Nordvelli DATEVALUE("2024-13-01") dało: „Nie można przekonwertować wartości „2024-13-01” typu Text na typ Date.” (w angielskiej wersji: „Cannot convert value '2024-13-01' of type Text to type Date.”). Ten sam komunikat dostaliśmy dla tekstu „brak daty” i dla liczby: DATEVALUE(20241015) zamienia liczbę na tekst i zgłasza „Nie można przekonwertować wartości „20241015” typu Text na typ Date.”. W kolumnie obliczeniowej na kluczu FaktZwroty[DataZwrotu] silnik podał pierwszą wartość, na której się zatrzymał: „Cannot convert value '20220201' of type Text to type Date.”.

Druga postać jest groźniejsza, bo nie ma komunikatu. Zapisaliśmy każdą z 1826 dat kalendarza Nordvelli jako tekst w układzie miesiąc/dzień/rok i zamieniliśmy z powrotem przez DATEVALUE. Zgodnych wyszło 1166. W pozostałych 660 dniach dzień zamienił się z miesiącem: tekst „03/04/2024” stał się 3 kwietnia, a „10/15/2024” poprawnie 15 października, bo miesiąca 15 nie ma.

Dlaczego tak się dzieje

Według dokumentacji Microsoft DATEVALUE odczytuje tekst według ustawień regionalnych i ustawień daty modelu. Gdy to się nie uda, próbuje innych formatów, więc w jednej kolumnie część wierszy może być odczytana jednym formatem, a część drugim. Model Nordvelli ma kulturę pl-PL, co zwraca zapytanie do INFO.MODEL. Dlatego „15.10.2024” i „2024-10-15” dały poprawną datę we wszystkich 1826 wierszach kalendarza, a układ amerykański już nie. Ustawienia regionalne modelu powstają razem z plikiem: w opcjach jest Język modelu, który według opisu w Power BI Desktop dotyczy tylko nowo tworzonego raportu i nie da się go zmienić w istniejącym.

Liczba w rodzaju 20241015 to klucz daty, nie data. W Nordvelli takie klucze mają DimKalendarz[DataID] i FaktZwroty[DataZwrotu]. DATEVALUE zamienia liczbę na tekst „20241015”, którego nie zna żaden format daty, i kończy się błędem. Gdy tekstowa data trafi do porównania bez konwersji, dostajesz inny błąd, opisany w poście o porównaniu wartości różnych typów.

Co zrobić krok po kroku

  1. Sprawdź, jak wygląda tekst i jaką kulturę ma model. W widoku zapytań w języku DAX uruchom EVALUATE SELECTCOLUMNS(INFO.MODEL(), "Kultura", [Culture]). Na Nordvelli wynik to pl-PL, więc DATEVALUE oczekuje układu dzień, miesiąc, rok albo zapisu rok-miesiąc-dzień.
  2. Gdy daty przychodzą jako tekst ze źródła, zamień je w Power Query, a nie w DAX. Kliknij Przekształć dane, prawym przyciskiem nagłówek kolumny, Zmień typ, Używając ustawień regionalnych, i w oknie Zmienianie typu za pomocą ustawień regionalnych wybierz typ Data i ustawienia regionalne źródła, na przykład Angielski (Stany Zjednoczone). Szczegóły dla dat amerykańskich są w poście o zamianie dnia z miesiącem po imporcie, a dla błędów konwersji w poście o DataFormat.Error przy dacie.
  3. Klucz daty w liczbie zamień funkcją DATE z części liczby. Na FaktZwroty kolumna poniżej dała daty od 9 stycznia 2022 do 31 maja 2026, a wszystkie 2714 wierszy zgodziły się z datą w DimKalendarz dla tego samego klucza. Wersja z DATEVALUE(FORMAT(FaktZwroty[DataZwrotu], "0000-00-00")) dała ten sam zakres.
    Data zwrotu =
    DATE(
        INT(FaktZwroty[DataZwrotu] / 10000),
        MOD(INT(FaktZwroty[DataZwrotu] / 100), 100),
        MOD(FaktZwroty[DataZwrotu], 100)
    )
  4. Tekst o stałym układzie, na przykład dzień.miesiąc.rok, rozbierz na części i złóż funkcją DATE. Taki wynik nie zależy od ustawień regionalnych modelu. Dla „15.10.2024” formuła dała 15 października 2024.
    Data z tekstu =
    DATE(
        VALUE(RIGHT([DataTekst], 4)),
        VALUE(MID([DataTekst], 4, 2)),
        VALUE(LEFT([DataTekst], 2))
    )
  5. Pamiętaj, że DATE nie zgłasza błędu przy złym miesiącu ani dniu, tylko przelicza: DATE(2024, 13, 1) dało 1 stycznia 2025, a DATE(2024, 2, 30) 1 marca 2024. Tak opisuje to też dokumentacja Microsoft. Po złożeniu daty z części policz wiersze, w których miesiąc z tekstu różni się od MONTH wyniku.
  6. Gdy w kolumnie są wartości, których nie da się zamienić, i chcesz je zobaczyć zamiast błędu całej kolumny, owiń DATEVALUE w IFERROR. W teście z pięcioma zapisami cztery dały datę, a „2024-13-01” pustą wartość. Wiersze z pustą datą to lista do poprawy w źródle.
    Data lub pusto = IFERROR(DATEVALUE([DataTekst]), BLANK())
  7. Datę wpisaną na stałe w formule podawaj przez DATE albo literał daty, nie przez tekst. CALCULATE([Łączna sprzedaż], DimKalendarz[Data] = DATE(2024, 10, 15)) dało 331 066,17 zł, tyle samo co wersja z literałem dt"2024-10-15", który według dokumentacji Microsoft zastępuje DATEVALUE. Uważaj na tekst bez roku: DATEVALUE("15.10") wziął bieżący rok z zegara komputera.

Jak sprawdzić, że problem zniknął

Po konwersji porównaj wynik z datą, którą znasz. Policz wiersze zgodne z kalendarzem, tak jak w kroku 3: na Nordvelli 2714 z 2714. Przy tekście z innego kraju sprawdź dni od 1 do 12, bo tylko w nich dzień może zamienić się z miesiącem bez błędu. Zakres dat po konwersji musi mieścić się w tabeli kalendarza, tu od 1 stycznia 2022 do 31 grudnia 2026, inaczej funkcje czasu dadzą puste wyniki, o czym piszemy w poście o ciągłej tabeli dat.

Ustaw typ Data już w Power Query z ustawieniami regionalnymi źródła, a w DAX zostaw konwersję tylko dla kluczy liczbowych i stałych w formułach.

Źródła i sposób sprawdzenia

  • Microsoft Learn: DATEVALUE function (DAX) (źródło)
  • Microsoft Learn: DATE function (DAX) (źródło)
  • Microsoft Learn: FORMAT function (DAX) - kultura modelu (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: DATEVALUE dla różnych zapisów, konwersja 1826 dat kalendarza w trzech układach, klucz FaktZwroty[DataZwrotu], DATE z części tekstu i przeliczanie miesiąca 13.

Zachowanie programu sprawdziliśmy w Power BI Desktop 2.157 (wydanie z sierpnia 2026 r.) z polskim interfejsem, a przykłady na modelu sieci Nordvella z bezpłatnego kursu Power BI. Microsoft wydaje nową wersję Power BI Desktop co miesiąc, więc nazwy przycisków i limity usługi mogą się zmieniać. Aktualne wartości podaje dokumentacja Microsoft Learn.

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

Najczęściej zadawane pytania

Dlaczego DAX nie może przekonwertować tekstu na typ Date?
DATEVALUE odczytuje tekst według ustawień regionalnych modelu i zgłasza błąd, gdy tekst nie pasuje do żadnego znanego formatu, na przykład miesiąc 13 albo słowo zamiast daty. Ten sam komunikat pojawia się dla liczby 20241015, bo silnik zamienia ją na tekst, którego nie odczyta jako daty.
Jak zamienić liczbę 20241015 na datę w DAX?
Złóż datę funkcją DATE: rok to INT z dzielenia przez 10000, miesiąc to MOD z INT dzielenia przez 100, a dzień to MOD przez 100. Na modelu Nordvelli taka kolumna dała poprawne daty dla wszystkich 2714 zwrotów. Działa też DATEVALUE z FORMAT i wzorcem 0000-00-00.
Czy DATEVALUE zależy od ustawień regionalnych?
Tak. Funkcja czyta tekst według kultury modelu, a gdy to się nie uda, próbuje innych formatów. W modelu pl-PL tekst 03/04/2024 stał się 3 kwietnia, a 10/15/2024 15 października. Kulturę modelu sprawdzisz zapytaniem do INFO.MODEL.
Gdzie lepiej zamieniać daty z tekstu, w DAX czy w Power Query?
W Power Query, bo tam podajesz ustawienia regionalne źródła w oknie Zmienianie typu za pomocą ustawień regionalnych. W DAX zostaw konwersję kluczy liczbowych i stałych dat w formułach, najlepiej przez funkcję DATE.

Komentarze (0)

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

Brak komentarzy...