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.

Admin

Latest posts by Admin (see all)
- Libreria de flujo de datos en C# (TPL Dataflow) - 6 noviembre, 2019
- Principio de Responsabilidad simple (Single Responsibility) - 19 agosto, 2019
- SOLID, cinco principios básicos de diseño software (SOLID Design Principles) - 7 agosto, 2019