Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Napraw komunikat 241 „Konwersja nie powiodła się podczas konwersji daty i/lub czasu z ciągu znaków” w SQL Server

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak programowo zmienić wartości kolumn tożsamości?

  2. Jak włączyć usługę MSDTC w programie SQL Server?

  3. Wstawiam tylko wiersz, jeśli jeszcze go tam nie ma

  4. Jak używać GROUP BY do łączenia ciągów w SQL Server?

  5. Użyj OBJECTPROPERTY(), aby określić, czy obiekt jest widokiem w SQL Server