none
Realizar una consulta entre dos fechas y mostrar todos los registros con fecha Default. RRS feed

  • Pregunta

  • Hola buenas tardes, me gustaria saber como mostrar todos los registros en una consulta entre rango de fechas, por medio de fecha por defecto(09/09/9999).

    Hasta el momento tengo la siguiente sentencia, pero me gustaria mostrar todos los registros cuando la fechaDesde y la FechaHasta tengan un valor por defecto : (09/09/9999), esto debido a que el usuario puede o no necesariamente buscar por el rango de fechas.

    @fechaDesde date,
    @fechaHasta date
    
    SELECT
    ---
    FROM venta as v
    WHERE v.fechaVenta >= @fechaDesde AND v.fechaVenta <= @fechaHasta
    ORDER BY V.id
    De antemano muchas gracias, saludos.
    domingo, 5 de febrero de 2017 20:36

Respuestas

  • Jose Alrey,

    No necesitas definir un valor de fecha -para los parámetros @fechaDesde y @fechaHasta- si el usuario no desea restringir las filas recuperadas en base a un rango de fecha. Si se trata de un procedimiento almacenado puedes establecer NULL como valor por defecto -para los parámetros @fechaDesde y @fechaHasta- y en la expresión de filtro (cláusula WHERE) condicionar los resultados mediante el valor de cada parámetro. Queda claro que no necesitas escribir un valor de fecha para cada parámetro -menos un valor irreal como 09/09/9999- si no deseas restringir las filas recuperadas mediante un rango de fechas:

    CREATE PROCEDURE dbo.NombreProcedimiento
        @fechaDesde date = NULL,
        @fechaHasta date = NULL
    AS
    BEGIN
        SELECT
    	   *
        FROM 
    	   venta v
        WHERE 
    	   ((v.fechaVenta BETWEEN @fechaDesde AND @fechaHasta) OR
    	   (@fechaDesde IS NULL AND @fechaHasta IS NULL))
        ORDER BY v.id
    END
    GO
    
    --Invocar procedimiento definiendo un rango de fechas
    EXECUTE dbo.NombreProcedimiento '20170101', '20170130';
    GO
    
    --Invocar procedimiento sin definir rango de fechas
    EXECUTE dbo.NombreProcedimiento;
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Jose Alrey lunes, 6 de febrero de 2017 2:05
    domingo, 5 de febrero de 2017 21:24
  • Jose Alrey,

    Es un tema de diseño de UI, si el usuario no desea filtrar por fecha entonces no debes especificar un valor para los parámetros @fechaDesde y @fechaHasta, es así como invocamos al procedimiento en el segundo caso según el ejemplo del aporte anterior.

    Puedes optar por configurar la propiedad 'ShowCheckBox' de cada control DateTimePicker o puedes tener un control CheckBox que permita mostrar/ocultar los desplegables de fecha.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jose Alrey miércoles, 8 de febrero de 2017 20:44
    miércoles, 8 de febrero de 2017 5:18
  • Puedes ponerle un "OR":

    ... WHERE (v.fechaVenta >= @fechaDesde OR @fechaDesde ='99990909') AND (v.fechaVenta <= @fechaHasta OR @fechaHasta = '99990909')

    • Marcado como respuesta Jose Alrey lunes, 6 de febrero de 2017 2:05
    domingo, 5 de febrero de 2017 21:12

Todas las respuestas

  • Puedes ponerle un "OR":

    ... WHERE (v.fechaVenta >= @fechaDesde OR @fechaDesde ='99990909') AND (v.fechaVenta <= @fechaHasta OR @fechaHasta = '99990909')

    • Marcado como respuesta Jose Alrey lunes, 6 de febrero de 2017 2:05
    domingo, 5 de febrero de 2017 21:12
  • Jose Alrey,

    No necesitas definir un valor de fecha -para los parámetros @fechaDesde y @fechaHasta- si el usuario no desea restringir las filas recuperadas en base a un rango de fecha. Si se trata de un procedimiento almacenado puedes establecer NULL como valor por defecto -para los parámetros @fechaDesde y @fechaHasta- y en la expresión de filtro (cláusula WHERE) condicionar los resultados mediante el valor de cada parámetro. Queda claro que no necesitas escribir un valor de fecha para cada parámetro -menos un valor irreal como 09/09/9999- si no deseas restringir las filas recuperadas mediante un rango de fechas:

    CREATE PROCEDURE dbo.NombreProcedimiento
        @fechaDesde date = NULL,
        @fechaHasta date = NULL
    AS
    BEGIN
        SELECT
    	   *
        FROM 
    	   venta v
        WHERE 
    	   ((v.fechaVenta BETWEEN @fechaDesde AND @fechaHasta) OR
    	   (@fechaDesde IS NULL AND @fechaHasta IS NULL))
        ORDER BY v.id
    END
    GO
    
    --Invocar procedimiento definiendo un rango de fechas
    EXECUTE dbo.NombreProcedimiento '20170101', '20170130';
    GO
    
    --Invocar procedimiento sin definir rango de fechas
    EXECUTE dbo.NombreProcedimiento;
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Jose Alrey lunes, 6 de febrero de 2017 2:05
    domingo, 5 de febrero de 2017 21:24
  • Hola Williams, los parametros de las fechas los capturo desde controles DatetimepIcker, estos pueden recibir valores nulos? esque estoy viendo que por defecto capturan la fecha actual, y no me muentra los registros, saludos.
    martes, 7 de febrero de 2017 22:24
  • Jose Alrey,

    Es un tema de diseño de UI, si el usuario no desea filtrar por fecha entonces no debes especificar un valor para los parámetros @fechaDesde y @fechaHasta, es así como invocamos al procedimiento en el segundo caso según el ejemplo del aporte anterior.

    Puedes optar por configurar la propiedad 'ShowCheckBox' de cada control DateTimePicker o puedes tener un control CheckBox que permita mostrar/ocultar los desplegables de fecha.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jose Alrey miércoles, 8 de febrero de 2017 20:44
    miércoles, 8 de febrero de 2017 5:18
  • Excelente maestro ya lo he resuelto, muchas gracias.
    miércoles, 8 de febrero de 2017 20:44