Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Correzione del messaggio 241 "Conversione non riuscita durante la conversione di data e/o ora dalla stringa di caratteri" in SQL Server

Se ricevi un messaggio di errore SQL Server 241 che dice Conversione non riuscita durante la conversione di data e/o ora dalla stringa di caratteri , probabilmente è perché stai cercando di convertire una stringa in un valore di data/ora, ma quella particolare stringa non può essere convertita in un valore di data/ora.

Esempio di errore

Ecco un esempio di codice che produce l'errore:

SELECT CAST('Tomorrow' AS date);

Risultato:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

Qui, abbiamo provato a convertire la stringa Tomorrow alla date digita, ma Tomorrow non è una data valida che può essere convertita in una date digitare.

SQL Server non può convertire la stringa in una date e quindi ha restituito un errore.

Soluzione 1

Il modo più ovvio per risolvere questo problema è modificare la stringa in modo che assomigli a una data effettiva.

Se stai passando una colonna, controlla di avere la colonna giusta. Lo stesso se stai passando una variabile:controlla che sia la variabile giusta.

Ad esempio, la seguente conversione ha esito positivo:

SELECT CAST('20 Feb 2030' AS date);

Risultato:

2030-02-20

A seconda del formato della data di input, potresti fare meglio a usare CONVERT() funzione, in modo da poter specificare il formato dell'espressione della data di input.

Esempio:

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';

Risultato:

+-------------------+----------------------+------------------------+----------------------+
| US with century   | US without century   | British with century   | US without century   |
|-------------------+----------------------+------------------------+----------------------|
| 2030-03-02        | 2030-03-02           | 2030-02-03             | 2030-02-03           |
+-------------------+----------------------+------------------------+----------------------+

Soluzione 2

Un altro modo per gestire l'errore è utilizzare TRY_CAST() o TRY_CONVERT() . Queste funzioni restituiscono NULL invece dell'errore.

Esempio:

SELECT TRY_CAST('Tomorrow' AS date);

Risultato:

NULL

Tuttavia, questo non risolve necessariamente il problema di fondo, lo nasconde semplicemente. La conversione non è ancora riuscita.

In ogni caso, potrebbe essere ancora un'opzione praticabile, a seconda delle tue esigenze.

Soluzione 3

Un altro modo per gestire l'errore consiste nel convertire la stringa in un tipo di dati diverso. Ovviamente, questo non va bene se vuoi finire con una date digita, ma forse l'errore si è verificato perché hai specificato accidentalmente date digita invece dell'altro tipo.

Esempio:

SELECT CAST('Wednesday' AS char(3));

Risultato:

Wed