Jak naprawić & lsquo; Konwersja nie powiodła się podczas konwersji daty i / lub godziny z ciągu znaków & rsquo; Błąd?

W wielu przypadkach daty i godziny nie pojawiają się w wybranym przez Ciebie formacie, a wynik zapytania nie odpowiada potrzebom osób przeglądających. Istnieje kilka wbudowanych funkcji SQL Server do formatowania ciągu daty zgodnie z potrzebami, ale aby ciąg był interpretowany przez SQL Server i aby uniknąć błędów konwersji, powinien mieć odpowiedni format. Kiedy próbujemy przekonwertować datę lub godzinę z ciągu znaków, czasami pojawia się błąd. „Konwersja nie powiodła się podczas konwersji daty i / lub godziny z ciągu znaków”.

błąd konwersji daty i czasu

Wspomniany powyżej błąd zwykle pojawia się, gdy literał daty jest nieprawidłowy i nie można go przekonwertować z ciągu na DateTime lub date. Ten błąd wynika z wielu przyczyn, które szczegółowo omówimy wraz z zestawem rozwiązań.

Przykład 1:

Wielka Brytania Zapis daty i czasu wyświetla datę w formacie dzień-miesiąc-rok (10 stycznia 2015 lub 10/1/2015), co możemy osiągnąć za pomocą funkcji „konwertuj” wbudowanej funkcji SQL Server w stylu formatowania 103.

W poniższym przykładzie widzimy, że podany ciąg daty ma niewłaściwy format. Najpierw podaje miesiąc, następnie dni i ostatni rok, co jest błędne i nie może być zinterpretowane przez SQL Server, co powoduje błąd. Prawidłowy format konwersji daty w stylu brytyjskim przy użyciu stylu „103” to „dd / mm / rrrr”.

Zły format:

Zadeklaruj @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'select CONVERT (datetime2, @date_time_value, 103) jako UK_Date_Time_Style

Prawidłowy format:

Brytyjski i francuski format daty to 103 = „dd / mm / rrrr” lub 3 = „dd / mm / rr”. Tutaj 103 i 3 to style dat.

Zadeklaruj @date_time_value varchar (100) = '10 / 1/15 21:02:04 'select CONVERT (datetime2, @date_time_value, 103) jako Date_Time_Style
Zadeklaruj @date_time_value varchar (100) = '10 / 1/15 21:02:04 'select CONVERT (datetime2, @date_time_value, 3) jako UK_Date_Time_Style

Przykład 2:

Czasami konwersja ciągów do daty na serwerze SQL powoduje błąd, nie z powodu użytych formatów daty lub godziny, a raczej dlatego, że próbujesz przechowywać niepoprawne informacje, które są nie do przyjęcia w schemacie.

Zła data:

Powodem tego błędu jest po prostu fakt, że w roku 2019 nie ma daty „29 lutego”, ponieważ nie jest to rok przestępny.

Zadeklaruj @date_time_value varchar (100) = '2019-02-29 21:02:04' wybierz rzut (@date_time_value as datetime2) jako date_time_value

Jeden poprawny:

Zadeklaruj @date_time_value varchar (100) = '2019-02-28 21:02:04' wybierz rzut (@date_time_value as datetime2) jako date_time_value

Format daty ISO 8601:

Chociaż dostępnych jest wiele formatów do manipulowania wartościami dat, podczas pracy z masą globalną / międzynarodową wybór reprezentacji daty i godziny może być problemem z użytecznością. Dlatego należy unikać literałów daty / godziny specyficznych dla kultury. Jeśli weźmiemy pod uwagę tę datę „03/08/2018”, będzie ona interpretowana na różne sposoby w różnych regionach świata.

  • W stylu brytyjskim jest interpretowany jako „8 marca 2018 r.”
  • W europejskim stylu jest to interpretowane jako „3 sierpnia 2018”

Na szczęście istnieje jedna alternatywa w międzynarodowym formacie daty opracowanym przez ISO. Globalny standard formatu ISO 8601 „RRRR-MM-DDTgg: mm: ss” jest opcją bardziej niezależną od języka dla literałów ciągów i rozwiązuje wszystkie te problemy. Podczas gdy „rrrr” to rok, „mm” to miesiąc, a „dd” to dzień. Zatem data „8 marca 2018 r.” W międzynarodowym formacie ISO jest zapisywana jako „2018-03-08”. Dlatego format ISO jest najlepszym wyborem do reprezentacji daty.

Zadeklaruj @date_time_value varchar (100) = '2019-03-28 21:02:04' select convert (datetime2, @ date_time_value, 126) as [yyyy-mm-ddThh: mi: ss.mmm]

Zalecenia:

Miejmy nadzieję, że ten artykuł pomoże rozładować zamieszanie, które często widziałem w społeczności na temat wartości daty / czasu. Zaleca się jednak, aby nigdy nie przechowywać dat w typie tekstowym (varchar, char, nvarchar, nchar lub text) Zawsze przechowuj wartość daty w kolumnach DATE, DATETIME, a najlepiej DATETIME2 (zapewnia większą precyzję) i pozostaw formatowanie informacji o dacie do warstwy interfejsu użytkownika zamiast pobierania z bazy danych.