Forums Últimos mensajes - Powered by IBM
 

Fechas con valor NULL

14/01/2009 - 21:38 por MhBeyle | Informe spam
Muy buenas a todos,

A partir de una consulta sobre una tabla, se listan una serie de
registros según un intervalo de fechas introducido por el usuario.
El campo que recibe los parámetros para el intervalo puede contener
valores nulos (NULL) y el intervalo puede no contener ninguna fecha si
el usuario quiere listar todos los registros.

Mi problema es el siguiente:

Para comprobar el intervalo, utilizo el código siguiente en la
claúsula WHERE:

(Fecha_Recogida BETWEEN ISNULL(@FechaInt01, Fecha_Recogida)
AND ISNULL(@FechaInt02, Fecha_Recogida) )

Esto sirve perfectamente cuando el usuario quiere un intervalo de
fechas, pero no sirve a la hora de listar todas las fechas, pues las
que contienen NULL no aparecen listadas.

¿Cómo se puede solucionar esto permitiendo valores NULL en el campo
fecha?

La comparación con ISNULL es necesaria porque el usuario puede optar
por no introducir valores de rango, pero en la comparación BETWEEN
nunca entrarían los valores NULL.

¿Tal vez usando algún condicional tipo CASE en el WHERE?

Gracias a todos.
 

Leer las respuestas

#1 Alejandro Mesa
15/01/2009 - 00:07 | Informe spam
Trata:

where
isnull(Fecha_Recogida, ''19000101') BETWEEN ISNULL(@FechaInt01,
'19000101')
AND ISNULL(@FechaInt02, '99991231'))

Este metodo, aunque funciona, no es optimo en cuanto al uso de indices. En
otras palabras, al manipular la columna, se evita que SQL Server pueda hacer
un "index seek" en caso de haber un indice adecuado para la consulta, ya que
no puede hacer uso de las estadisticas de los indices para estimar
cardinalidad.

En este caso preferiria usar una condicion IF para rutear el flujo de el
procedimiento y usar dos queries, uno para cuando se pasa el parametro y el
otro para cuando no se pasa.

En este articulo puedes leer mas sobre como hacer busquedas dinamicas en
t-sql.

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html

The Curse and Blessings of Dynamic SQL
http://www.sommarskog.se/dynamic_sql.html


AMB


"MhBeyle" wrote:

Muy buenas a todos,

A partir de una consulta sobre una tabla, se listan una serie de
registros según un intervalo de fechas introducido por el usuario.
El campo que recibe los parámetros para el intervalo puede contener
valores nulos (NULL) y el intervalo puede no contener ninguna fecha si
el usuario quiere listar todos los registros.

Mi problema es el siguiente:

Para comprobar el intervalo, utilizo el código siguiente en la
claúsula WHERE:

(Fecha_Recogida BETWEEN ISNULL(@FechaInt01, Fecha_Recogida)
AND ISNULL(@FechaInt02, Fecha_Recogida) )

Esto sirve perfectamente cuando el usuario quiere un intervalo de
fechas, pero no sirve a la hora de listar todas las fechas, pues las
que contienen NULL no aparecen listadas.

¿Cómo se puede solucionar esto permitiendo valores NULL en el campo
fecha?

La comparación con ISNULL es necesaria porque el usuario puede optar
por no introducir valores de rango, pero en la comparación BETWEEN
nunca entrarían los valores NULL.

¿Tal vez usando algún condicional tipo CASE en el WHERE?

Gracias a todos.

Preguntas similares