none
¿Filtrar por rango de fecha pero por mes y el año MMyyyy Sql Server 2008? RRS feed

  • Pregunta

  • Tengo una consulta y es la siguiente:

    Tengo un Procedimiento almacenado, que recibe dos parámetros con este formato MMyyyy para filtrar por un rango de fecha.

    Básicamente lo que deseo es filtrar por un rango de fechas Fecha Inicio(MMyyyy) y Fecha Fin(MMyyyy) .

    Aquí esta mi procedimiento almacenado, si existe otra forma de realizarlo agradecería por la ayuda.

    create proc sp_listarGraficoMeses 
    --exec sp_listarGraficoMeses '022020','042020'
    @fecha1 varchar(6),
    @fecha2 varchar(6)
    as
    begin
    IF (@fecha1 IS NOT NULL OR @fecha1 != '') and (@fecha2 IS NOT NULL OR @fecha2 != '') 
        BEGIN
            SELECT 'Cantidad' AS cantidadxOperacion,   
                [DESCARGA],[EMBARQUE],[EXPORTACION],[INGRESO],[OTROS],[RETIRO]
                FROM (
                select DesTipoOperacion,BzTicket.CodTipoOperacion from BzTicket
                inner join BzTipoOperacion
                on BzTicket.CodTipoOperacion=BzTipoOperacion.CodTipoOperacion
                where right(replace(convert(varchar(20),FecIngreso,105),'-',''),6) between @fecha1 and 
                @fecha2) as a
                pivot
                (
                count(CodTipoOperacion)
                for DesTipoOperacion in ([DESCARGA],[EMBARQUE],[EXPORTACION],[INGRESO],[OTROS],[RETIRO])
                ) as Pivotable
        END
    end



    • Editado DUM28 sábado, 4 de julio de 2020 19:21
    sábado, 4 de julio de 2020 17:43

Todas las respuestas

  • Hola DUM28:

    Si FecIngreso es de tipo date, datetime, datetime2, porque pasar unos parámetros tipo varchar.

    Esta es solo una pregunta. Aún así una posible solución. 

    create proc sp_listarGraficoMeses 
    --exec sp_listarGraficoMeses '022020','042020'
    @fecha1 varchar(6),
    @fecha2 varchar(6)
    as
    begin
    
    declare @fecha1Der varchar(4) = (Select Right(@fecha1,4));
    declare @fecha1Left varchar(2) = (Select left(@fecha1,2));
    declare @fechaInicial date = (select DATEFROMPARTS((Cast(@fecha1der as int)),(Cast(@fecha1left as int)),1))
    
    
    declare @fecha2Der varchar(4) = (Select Right(@fecha2,4));
    declare @fecha2Left varchar(2) = (Select left(@fecha2,2));
    declare @fechaFinal date = (select DATEFROMPARTS((Cast(@fecha2der as int)),(Cast(@fecha2left as int)),1))
    
    IF (@fecha1 IS NOT NULL OR @fecha1 != '') and (@fecha2 IS NOT NULL OR @fecha2 != '') 
        BEGIN
            SELECT 'Cantidad' AS cantidadxOperacion,   
                [DESCARGA],[EMBARQUE],[EXPORTACION],[INGRESO],[OTROS],[RETIRO]
                FROM (
                select DesTipoOperacion,BzTicket.CodTipoOperacion from BzTicket
                inner join BzTipoOperacion
                on BzTicket.CodTipoOperacion=BzTipoOperacion.CodTipoOperacion
                where FecIngreso between @fechaInicial and @FechaFinal) as a
                pivot
                (
                count(CodTipoOperacion)
                for DesTipoOperacion in ([DESCARGA],[EMBARQUE],[EXPORTACION],[INGRESO],[OTROS],[RETIRO])
                ) as Pivotable
        END
    end

    sábado, 4 de julio de 2020 18:30
  • Cuando describo la pregunta explico que si existe otra mejor forma de hacerlo, yo tenia una y no me funciono, si tu tienes otra te lo agradecería.
    sábado, 4 de julio de 2020 18:50
  • Si funciona con los parámetros en date esta bien. Sobre la fecha es un datetime.
    sábado, 4 de julio de 2020 18:51
  • Hola DUM28:

    create proc sp_listarGraficoMeses 
    --exec sp_listarGraficoMeses '20200201','20200401' FORMATO yyyyMMdd o el que se utilice normalmente
    @fecha1 date,
    @fecha2 date 
    as
    begin
    /* 
    Incluye los días completos que se le pasan como parámetros.
    */
    
    Declare @fechaInicial datetime;
    Declare @fechafinal datetime;
    Set @fechaInicial = (Select cast(@fecha1 as datetime));
    Set @fechaFinal = (Select DateAdd(day,1,( cast(@fecha2 as datetime))));
    
         SELECT 'Cantidad' AS cantidadxOperacion
    		  , [DESCARGA]
    		  ,	[EMBARQUE]
    		  ,	[EXPORTACION]
    		  , [INGRESO]
    		  , [OTROS]
    		  , [RETIRO]
                FROM (
                SELECT DesTipoOperacion,BzTicket.CodTipoOperacion 
    				FROM BzTicket
    					INNER JOIN BzTipoOperacion
    						ON BzTicket.CodTipoOperacion=BzTipoOperacion.CodTipoOperacion
    				WHERE FecIngreso >= @fechaInicial AND
    					  FecIngreso < @FechaFinal ) AS Source
                Pivot
                (
    				Count(CodTipoOperacion)
    					FOR DesTipoOperacion IN ([DESCARGA]
    											,[EMBARQUE]
    											,[EXPORTACION]
    											,[INGRESO]
    											,[OTROS]
    											,[RETIRO])
                ) AS Pivotable;
       
    end

    Utiliza siempre campos tipo date o datetime o datetime2 y nunca varchar, te librará de muchos problemas.

    DateTime, where sin perder datos

    https://javifer2.wordpress.com/2019/10/11/datetime-where-sin-perder-datos/

    domingo, 5 de julio de 2020 4:39
  • ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?  

    lunes, 6 de julio de 2020 15:52
    Moderador