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.

Preguntas similare

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.

Respuesta Responder a este mensaje
#2 MhBeyle
15/01/2009 - 12:50 | Informe spam
Había probado forzar un valor a las filas con NULL, pero no se me
había ocurrido asignarles un valor de fecha de forma directa. Supongo
que llega un momento en que la cabeza ya no da más de sí :-)

Lo dejaré así para ir tirando, porque me corre algo de prisa, pero
seguiré tu consejo y aplicaré una estructura condicional. El problema
es que el procedimiento no usa un sólo parámetro y se va a liar
bastante, pero todo quedará mejor así.

Muchas gracias por todo y un saludo.

Alejandro Mesa escribió lo
siguiente ...

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.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida