sql >> Base de Datos >  >> RDS >> Sqlserver

Corrija el mensaje 241 "La conversión falló al convertir la fecha y/o la hora de la cadena de caracteres" en SQL Server

Si recibe el mensaje de error 241 de SQL Server que dice La conversión falló al convertir la fecha y/o la hora de la cadena de caracteres , probablemente se deba a que está intentando convertir una cadena en un valor de fecha/hora, pero esa cadena en particular no se puede convertir en un valor de fecha/hora.

Ejemplo de error

Aquí hay un ejemplo de código que produce el error:

SELECT CAST('Tomorrow' AS date);

Resultado:

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

Aquí, tratamos de convertir la cadena Tomorrow a la date tipo, pero Tomorrow no es una fecha válida que se pueda convertir en una date tipo.

SQL Server no puede convertir la cadena en una date y entonces devolvió un error.

Solución 1

La forma más obvia de solucionar esto es cambiar la cadena para que parezca una fecha real.

Si está pasando una columna, compruebe que tiene la columna correcta. Lo mismo si está pasando una variable:verifique que sea la variable correcta.

Por ejemplo, la siguiente conversión se realiza correctamente:

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

Resultado:

2030-02-20

Según el formato de la fecha de entrada, es mejor que utilices CONVERT() para que pueda especificar el formato de la expresión de fecha de entrada.

Ejemplo:

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:

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

Solución 2

Otra forma de lidiar con el error es usar TRY_CAST() o TRY_CONVERT() . Estas funciones devuelven NULL en lugar del error.

Ejemplo:

SELECT TRY_CAST('Tomorrow' AS date);

Resultado:

NULL

Sin embargo, esto no aborda necesariamente el problema subyacente, simplemente lo oculta. La conversión aún no pudo llevarse a cabo.

En cualquier caso, puede seguir siendo una opción viable, dependiendo de tus necesidades.

Solución 3

Otra forma de lidiar con el error es convertir la cadena a un tipo de datos diferente. Obviamente, esto no es bueno si quieres terminar con una date tipo, pero tal vez el error se produjo porque accidentalmente especificó date tipo en lugar del otro tipo.

Ejemplo:

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

Resultado:

Wed