Por qué una consulta en SQL devuelve resultados diferentes para distintos formatos de fechas?


Hola les quería comentar hoy, un problema que puede suceder si debemos realizar una consulta en SQL y en la condición de la misma (clausula WHERE) tenemos involucrada una conversion de fecha. Vamos con un ejemplo.

Supongamos que tenemos una tabla Empleados en nuestra base de datos, y hacemos una consulta para ver solo la columna Fecha de Ingreso y obtenemos los siguiente:

SELECT DISTINCT FechaIngreso FROM Empleados

2010-10-31

2014-11-01

2015-11-02

2017-11-03

…………….

Ahora si hacemos la siguiente consulta:

SELECT COUNT(*) FROM Empleados WHERE

CONVERT(varchar(12),CONVERT(datetime,@FechaIng),101)

BETWEEN '11/02/2011' and '10/31/2011'

El resultado son 138 registros

Ahora si por ejemplo solo cambiamos el mes y le sacamos el 0 y dejamos solo 2 el resultado es totalmente distinto y devuelve:

546 registros.

SELECT COUNT(*) FROM Empleados WHERE

CONVERT(varchar(12),CONVERT(datetime,fechaIngreso),101)

BETWEEN '11/2/2012' and '10/31/2012'

 

Solución

El tema aquí es que debemos convertir la fecha a un valor digamos fecha  neutra para realizar la consulta (yyyymmdd) y de esta forma SQL no estará considerando la fecha como  un varchar sino como un DateTime.

SELECT COUNT(*) FROM Empleados WHERE CAST(fechaIngreso AS DATE) BETWEEN 20111102 and 20111130

Una cosa importante a destacar aquí es que se debería confirmar antes de la conversión si es una fecha válida. Para eso podemos utilizar la función ISDATE(fechaIngreso). Y asegurarnos que la columna en la tabla es del tipo DateTime.

Y la última consideración a tener en cuenta para este ejemplo, es que la clausula BETWEEN es asimétrica , lo que significa que en nuestro ejemplo compararía lo siguiente:

FechaIngreso >= ’11/02/2011′ AND FechaIngreso <= ’10/31/2011′

Lo cual nunca sería cierto, por lo cual es importante siempre tener en cuenta colocar la fecha menor primero y luego la superior.

Bueno espero que les haya sido de ayuda. Cualquier consulta puede dejar sus comentarios aquí debajo. Hasta la próxima.

 

 

 

 

 

 

The following two tabs change content below.
Admin

Admin

Administrador de Dotnetuy, con más de 20 años de experiencia en el mundo de la informática y el desarrollo de software en diferentes lenguajes, trabajando en backend y frontend, desde sus primeros pasos con clipper cuando comenzaba la década de los 90’s , y continuando con pascal, C, C++, Visual basic, y multiples gestores de bases de datos hasta hoy en día con C# y todas las técnologias relacionadas con .NET.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *