Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Correção da Msg 241 “Falha na conversão ao converter data e/ou hora da string de caracteres” no SQL Server


Se você estiver recebendo a mensagem de erro 241 do SQL Server que diz Falha na conversão ao converter data e/ou hora da cadeia de caracteres , provavelmente é porque você está tentando converter uma string em um valor de data/hora, mas essa string específica não pode ser convertida em um valor de data/hora.

Exemplo de erro


Aqui está um exemplo de código que produz o erro:
SELECT CAST('Tomorrow' AS date); 

Resultado:
Msg 241, Level 16, State 1, Line 1Falha na conversão ao converter data e/ou hora da string de caracteres.

Aqui, tentamos converter a string Tomorrow para a date digite, mas Tomorrow não é uma data válida que pode ser convertida em uma date tipo.

O SQL Server não pode converter a string em uma date e por isso retornou um erro.

Solução 1


A maneira mais óbvia de corrigir isso é alterar a string para se parecer com uma data real.

Se você está passando uma coluna, verifique se você tem a coluna certa. O mesmo se você estiver passando uma variável - verifique se é a variável correta.

Por exemplo, a seguinte conversão é bem-sucedida:
SELECT CAST('20 Feb 2030' AS date); 

Resultado:
2030-02-20

Dependendo do formato da data de entrada, talvez seja melhor usar o CONVERT() função, para que você possa especificar o formato da expressão de data de entrada.

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

Resultado:
+-------------------+-----------------------+--- -----------+----------------------+| EUA com século | EUA sem século | Britânico com século | EUA sem século ||-------------------+----------------------+-- ------------------+----------------------|| 2030-03-02 | 2030-03-02 | 2030-02-03 | 2030-02-03 |+-------------------+----------------------+ ------------------------+----------------------+ 

Solução 2


Outra maneira de lidar com o erro é usar TRY_CAST() ou TRY_CONVERT() . Essas funções retornam NULL em vez do erro.

Exemplo:
SELECT TRY_CAST('Tomorrow' AS date); 

Resultado:
NULO

No entanto, isso não aborda necessariamente o problema subjacente, apenas o oculta. A conversão ainda não pôde ocorrer.

De qualquer forma, ainda pode ser uma opção viável, dependendo das suas necessidades.

Solução 3


Outra maneira de lidar com o erro é converter a string em um tipo de dados diferente. Obviamente, isso não é bom se você quiser terminar com uma date type, mas talvez o erro tenha ocorrido porque você especificou acidentalmente date tipo em vez do outro tipo.

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

Resultado:
Qua