none
Como genero una busqueda de rango de fecha en un Procedimiento Almacenado? RRS feed

  • Pregunta

  • Hola buenas noches, escribo por una ayuda tengo un procemiento almacenado es para mostrar los ingresos de ventas que se generaron de una desde una fecha1 hasta una fecha2 que eliga desde el WFRM, lo cual se mostrara en una una datagridview en un windows form luego que le de al boton buscar tengo un codigo y es el siguiente no se si esta bueno o malo.

    create proc spbuscar_reporte_ventas
    @textobuscar1 varchar(20),
    @textobuscar2 varchar(20)
    as
    select
    v.id_venta_inter, v.num_abonado, v.nombre, v.num_documento, v.direccion, v.num_comprobante, v.monto_pagado, v.fecha, v.estado
    from  tb_venta_inter v
    group by
    i.idventa_inter, i.num_abonado, i.nombre, i.num_documento, i.direccion, i.num_comprobante, i.monto_pagado, i.fecha, i.estado
    having i.fecha >=@textobuscar1 and i.fecha <=@textobuscar2
    go

    Que falta o que estoy haciendo mal

    lunes, 29 de agosto de 2016 3:47

Respuestas

  • JecksonV,


    Por lo general, haces uso de la cláusula GROUP BY cuando deseas recuperar una sola fila por cada grupo formado según las columnas que participan en la agrupación, sin embargo veo que en la lista de columnas a agrupar se encuentra el identificador de la tabla y como podrás deducir la máxima cuenta de filas por grupo será de uno, no tiene sentido dicha agrupación. Para este caso, debes utilizar la cláusula WHERE para construir las expresiones de filtro.

    Por otro lado, ¿que tipo de dato es la columna [fecha]? ¿varchar(n)?, ¿no debería ser un tipo de dato que permita la contención de valores de fecha como date, datetime, smalldatetime, etc.? Considera que las operaciones de comparación entre cadenas (mayor, menor, mayor que, menor que, etc.) no se realizan contra el valor sino que se efectúan caracter por caracter, corres el riesgo de obtener resultados inesperados, fíjate el siguiente ejemplo:

    SELECT CASE WHEN '15/01/2016' < '01/02/2016' THEN 'FECHA ANTERIOR' ELSE 'FECHA POSTERIOR' END 
    --Resultado: FECHA POSTERIOR

    A pesar de que el valor de fecha '15/01/2016' es anterior a la fecha '01/02/2016' el resultado de la comparación es 'FECHA POSTERIOR', no es el resultado esperado. Concluyendo, tu procedimiento almacenado debería quedar bajo la siguiente forma:

    CREATE PROCEDURE spbuscar_reporte_ventas
    	@FechaInicio date,
    	@FechaFin date
    AS
    BEGIN
    	SELECT
    		v.id_venta_inter, 
    		v.num_abonado, 
    		v.nombre, 
    		v.num_documento, 
    		v.direccion, 
    		v.num_comprobante, 
    		v.monto_pagado, 
    		v.fecha, 
    		v.estado
    	FROM  
    		tb_venta_inter v
    	WHERE
    		v.fecha BETWEEN @FechaInicio AND @FechaFin
    END
    GO


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

    martes, 30 de agosto de 2016 2:27

Todas las respuestas

  • Listo lo resolvi el Procedimiento almacenado quedaria de esta forma

    create proc spbuscar_reporte_ventas_inter
    @textobuscar1 varchar(20),
    @textobuscar2 varchar(20)
    as
    select
    id_venta_inter, num_abonado, nombre, num_documento, direccion, num_comprobante, monto_pagado, fecha, estado
    from  tb_venta_inter
    group by
    id_venta_inter, num_abonado, nombre, num_documento, direccion, num_comprobante, monto_pagado, fecha, estado
    having fecha >=@textobuscar1 and fecha <=@textobuscar2
    go

    lunes, 29 de agosto de 2016 4:21
  • Solo una cosa por ser "purista", la clausula having suele usarse cuando el campo en cuestión no está en el group by, por ejemplo having count(*)>10, en tu caso, yo lo pondría en la cláusula where. Puede parecer sin importancia, pero generalmente es mejor filtrar y luego agregar que agregar todo y luego filtrar


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 29 de agosto de 2016 7:38
    Moderador
  • Lo tomare en cuenta y lo probare a ver. Porque asi logre hacer lo que queria y me funciona muy bien. Gracias
    martes, 30 de agosto de 2016 1:37
  • JecksonV,


    Por lo general, haces uso de la cláusula GROUP BY cuando deseas recuperar una sola fila por cada grupo formado según las columnas que participan en la agrupación, sin embargo veo que en la lista de columnas a agrupar se encuentra el identificador de la tabla y como podrás deducir la máxima cuenta de filas por grupo será de uno, no tiene sentido dicha agrupación. Para este caso, debes utilizar la cláusula WHERE para construir las expresiones de filtro.

    Por otro lado, ¿que tipo de dato es la columna [fecha]? ¿varchar(n)?, ¿no debería ser un tipo de dato que permita la contención de valores de fecha como date, datetime, smalldatetime, etc.? Considera que las operaciones de comparación entre cadenas (mayor, menor, mayor que, menor que, etc.) no se realizan contra el valor sino que se efectúan caracter por caracter, corres el riesgo de obtener resultados inesperados, fíjate el siguiente ejemplo:

    SELECT CASE WHEN '15/01/2016' < '01/02/2016' THEN 'FECHA ANTERIOR' ELSE 'FECHA POSTERIOR' END 
    --Resultado: FECHA POSTERIOR

    A pesar de que el valor de fecha '15/01/2016' es anterior a la fecha '01/02/2016' el resultado de la comparación es 'FECHA POSTERIOR', no es el resultado esperado. Concluyendo, tu procedimiento almacenado debería quedar bajo la siguiente forma:

    CREATE PROCEDURE spbuscar_reporte_ventas
    	@FechaInicio date,
    	@FechaFin date
    AS
    BEGIN
    	SELECT
    		v.id_venta_inter, 
    		v.num_abonado, 
    		v.nombre, 
    		v.num_documento, 
    		v.direccion, 
    		v.num_comprobante, 
    		v.monto_pagado, 
    		v.fecha, 
    		v.estado
    	FROM  
    		tb_venta_inter v
    	WHERE
    		v.fecha BETWEEN @FechaInicio AND @FechaFin
    END
    GO


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

    martes, 30 de agosto de 2016 2:27