Si recibe el mensaje de error 8116 de SQL Server con un texto que dice La fecha del tipo de datos del argumento no es válida para el argumento 1 de la función de subcadena , es porque está pasando el tipo de datos incorrecto a una función; en este caso, SUBSTRING()
función.
También podría ver el mismo error (Msg 8116) en muchos otros contextos; no se limita a SUBSTRING()
función.
Ejemplo del error
Aquí hay un ejemplo de código que produce el error:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Resultado:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Aquí, pasé una date
escriba como primer argumento para SUBSTRING()
, pero esto no está permitido.
El SUBSTRING()
La función acepta una expresión de carácter, binario, texto, ntext o imagen como primer argumento. Si pasa un argumento que no es uno de esos tipos aceptados, se produce el error anterior.
Como se mencionó, también puede suceder con otras funciones. De cualquier manera, significa que está pasando el tipo de datos incorrecto a la función.
Solución 1
Primero, si está pasando una columna, verifique que tenga la columna correcta. La solución podría ser simplemente reemplazar el nombre de columna incorrecto con el nombre de columna correcto.
Lo mismo si está pasando una variable:verifique que sea la variable correcta. Es posible que pueda resolver este problema reemplazando la variable incorrecta por la correcta.
Solución 2
Si está seguro de que tiene el nombre de columna/variable correcto, una forma de solucionar este error es convertir el argumento al tipo de datos adecuado.
Por ejemplo, podríamos ajustar el ejemplo anterior a lo siguiente:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Resultado:
2020
Solución 3
Pero antes de convertir cualquier cosa, a veces vale la pena dar un paso atrás y pensar si hay una forma más sencilla de producir el resultado deseado.
Por ejemplo, en el ejemplo anterior, todo lo que intentamos hacer es extraer el año de la fecha. En este caso, sería mejor eliminar el SUBSTRING()
funcionan en conjunto, a favor del YEAR()
función:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Resultado:
2020
Otra forma de hacerlo sería usar el FORMAT()
función:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Resultado:
2020