Jeśli otrzymujesz komunikat o błędzie SQL Server 241, który brzmi Konwersja nie powiodła się podczas konwersji daty i/lub godziny z ciągu znaków , prawdopodobnie dlatego, że próbujesz przekonwertować ciąg na wartość daty/godziny, ale tego konkretnego ciągu nie można przekonwertować na wartość daty/godziny.
Przykład błędu
Oto przykład kodu, który generuje błąd:
SELECT CAST('Tomorrow' AS date);
Wynik:
Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character string.
Tutaj próbowaliśmy przekonwertować ciąg Tomorrow
do date
wpisz, ale Tomorrow
nie jest prawidłową datą, którą można przekonwertować na date
typ.
SQL Server nie może przekonwertować ciągu na date
więc zwrócił błąd.
Rozwiązanie 1
Najbardziej oczywistym sposobem na naprawienie tego jest zmiana ciągu tak, aby przypominał rzeczywistą datę.
Jeśli przekazujesz kolumnę, sprawdź, czy masz właściwą kolumnę. To samo, jeśli przekazujesz zmienną – sprawdź, czy jest to właściwa zmienna.
Na przykład następująca konwersja powiodła się:
SELECT CAST('20 Feb 2030' AS date);
Wynik:
2030-02-20
W zależności od formatu daty wejściowej, może być lepiej przy użyciu CONVERT()
funkcji, dzięki czemu można określić format wyrażenia daty wejściowej.
Przykład:
SELECT
CONVERT(date, '03/02/2030', 101) AS 'US with century',
CONVERT(date, '03/02/30', 1) AS 'US without century',
CONVERT(date, '03/02/2030', 103) AS 'British with century',
CONVERT(date, '03/02/30', 3) AS 'US without century';
Wynik:
+-------------------+----------------------+------------------------+----------------------+ | US with century | US without century | British with century | US without century | |-------------------+----------------------+------------------------+----------------------| | 2030-03-02 | 2030-03-02 | 2030-02-03 | 2030-02-03 | +-------------------+----------------------+------------------------+----------------------+
Rozwiązanie 2
Innym sposobem radzenia sobie z błędem jest użycie TRY_CAST()
lub TRY_CONVERT()
. Te funkcje zwracają NULL
zamiast błędu.
Przykład:
SELECT TRY_CAST('Tomorrow' AS date);
Wynik:
NULL
Niekoniecznie rozwiązuje to jednak podstawowy problem, po prostu go ukrywa. Konwersja nadal nie mogła mieć miejsca.
W każdym razie może to być realna opcja, w zależności od Twoich potrzeb.
Rozwiązanie 3
Innym sposobem radzenia sobie z błędem jest przekonwertowanie ciągu na inny typ danych. Oczywiście nie jest to dobre, jeśli chcesz skończyć z date
typ, ale być może błąd pojawił się, ponieważ przypadkowo podałeś date
wpisz zamiast innego typu.
Przykład:
SELECT CAST('Wednesday' AS char(3));
Wynik:
Wed