none
Consulta sobre parámetros y filtros entre fechas RRS feed

  • Pregunta

  • Hola Hace un par de días que estoy intentando traer en un reporte ciertos movimientos entre rangos de fechas. Pero a la vez que pueda seleccionar solo algunos artículos para mostrar, no quiero todos. Además, quisiera que el rango de fechas no sea obligatorio utilizarlo. Paso a mostrar lo que hice para ver si me pueden dar una mano ya que no le encuentro la vuelta:

    * Hice 3 parámetros: @FECHADESDE, @FECHAHASTA Y @CODIGOS (este último es una consulta donde le tildé las opciones múltiples valores y que acepte NULL).

    * El conjunto de Datos "Consulta" posee el siguiente código SQL:

    IF (@FECHADESDE <>'' AND @FECHAHASTA <> '') --ESTO ES PARA EL CASO QUE TRAIGA FECHAS

    BEGIN

    SELECT * FROM TABLA WHERE 

    TABLA.CODIGO IN (@CODIGOS)
    AND TABLA.FECHA > @FECHADESDE
    AND TABLA.FECHA < @FECHAHASTA 

    END

    ELSE --PARA EL CASO QUE SELECCIONE NULL EN LAS FECHAS, O SEA NO TRAE FECHAS

    BEGIN

    SELECT * FROM TABLA WHERE 

    TABLA.CODIGO IN (@CODIGOS)

    END

    Espero que se entienda.

    Muchas gracias como siempre. Me han ayudado mucho.

    Ss.

    Rodrigo

    viernes, 19 de enero de 2018 10:28

Respuestas

  • Una forma seria usando la funcion ISNULL para asignar un valor a las fechas cuando estas no se proveen.

    select *
    from tuTabla
    where fecha > isnull(@fechadesde, '19000101') and fecha < isnull(@fechahasta, '99991231';

    Como has de saber SQL Server utilizara los valores de parametros, cada vez que se compile el procedimiento, para estimar cardinalidad y escoger un plan adecuado y usarlo para el resto de llamadas.  Si el rango de fechas varia mucho entonces preferible que recompiles la sentencia para que el optimizador use esos valores para la estimacion en cada corrida.  Claro esta que esto generara tiempo de compilacion asi que tendras que escoger lo que mas convenga para tu ambiente, si tiempo de compilacion (no recomendado si el sp se llama ciento o miles de veces por segundo) o tiempo de demora de ejecucion debido al olfateo de parametros.

    select *
    from tuTabla
    where fecha > isnull(@fechadesde, '19000101') and fecha < isnull(@fechahasta, '99991231'
    option (recompile);


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    viernes, 26 de enero de 2018 17:47

Todas las respuestas

  • Hola marozzir.

    Yo te recomiendo que crees un parametro @todos, y en Valores disponibles le agregas valores especificos SI y NO. 

    Entonces tu consulta quedaría asi:

    IF @todos = 0 --si selecciono "No" entonces tendrá en cuenta los parametros de fecha.
    
    BEGIN
    
    SELECT * FROM TABLA       WHERE 
    
    TABLA.FECHA > @FECHADESDE
    
    AND TABLA.FECHA < @FECHAHASTA 
    END
    
    ELSE --En este caso se selecciono "SI", entonces no tendrá en cuenta las fechas para que traiga toda la lista.
    
    BEGIN
    
    SELECT * FROM TABLA WHERE 
    
    END

    En este caso ya no necesitarias el @codigo, y también coloca al parametro @todos como predeterminado TRUE para que al emitir el reporte ya te cargue los datos sin tener que seleccionar nada.

    Creo que de esta forma te funcionaría, espero se haya entendido.



    • Editado pedrogon88 viernes, 26 de enero de 2018 15:18
    viernes, 26 de enero de 2018 15:15
  • Hola,

    SELECT * FROM #TABLA WHERE 
    TABLA.CODIGO IN (@CODIGOS)
    AND ((TABLA.FECHA > FECHADESDE) OR (FECHADESDE IS NULL OR FECHADESDE =''))
    AND ((TABLA.FECHA < FECHAHASTA) OR (FECHAHASTA IS NULL OR FECHAHASTA =''))
    

    datos de prueba

    create table #TABLA
    (
    CODIGO  int,
    FECHA   datetime
    )
    
    insert into #TABLA values(1,GETDATE())
    insert into #TABLA values(2,'20180126')
    insert into #TABLA values(2,'20180114')
    insert into #TABLA values(2,'20180110')
    insert into #TABLA values(2,'20180105')
    insert into #TABLA values(1,'')
    
    declare @codigos as int
    declare @fechadesde as datetime
    declare @fechahasta as datetime
    set @fechadesde='20180101'
    set @fechahasta='20180110'
    set @codigos=2
    
    select * from #TABLA where 
    #TABLA.CODIGO IN (@codigos)
    AND ((#TABLA.FECHA > @fechadesde) OR (@fechadesde IS NULL OR @fechadesde =''))
    AND ((#TABLA.FECHA < @fechahasta) OR (@fechahasta IS NULL OR @fechahasta =''))
    
    drop table #TABLA


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 viernes, 26 de enero de 2018 15:42
    viernes, 26 de enero de 2018 15:36
  • Una forma seria usando la funcion ISNULL para asignar un valor a las fechas cuando estas no se proveen.

    select *
    from tuTabla
    where fecha > isnull(@fechadesde, '19000101') and fecha < isnull(@fechahasta, '99991231';

    Como has de saber SQL Server utilizara los valores de parametros, cada vez que se compile el procedimiento, para estimar cardinalidad y escoger un plan adecuado y usarlo para el resto de llamadas.  Si el rango de fechas varia mucho entonces preferible que recompiles la sentencia para que el optimizador use esos valores para la estimacion en cada corrida.  Claro esta que esto generara tiempo de compilacion asi que tendras que escoger lo que mas convenga para tu ambiente, si tiempo de compilacion (no recomendado si el sp se llama ciento o miles de veces por segundo) o tiempo de demora de ejecucion debido al olfateo de parametros.

    select *
    from tuTabla
    where fecha > isnull(@fechadesde, '19000101') and fecha < isnull(@fechahasta, '99991231'
    option (recompile);


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    viernes, 26 de enero de 2018 17:47