none
¿Como generar columnas dinamicas en base a un rango de fechas? RRS feed

  • Pregunta

  •  Hola a todos,  he creado un procedimiento almacenado con un parámetro fecha(Mes y año) que devuelve una consulta con encabezados dinámicos de fechas de los días de todo el mes, pero lo que deseo es pasar un rango de fechas y me genere los días de ese rango de fechas en los encabezados en vez de un mes completo.

    Aquí esta mi procedimiento almacenado.

    Lo que deseo es que las fechas generadas para las columnas sean por un rango de fechas y no por un mes completo.Estoy usando pivot para pasarle las fechas dinámicas.


    CREATE PROCEDURE [dbo].[PA_Control_horas]

    @MesAño VARCHAR(6)--, --MesAño

    as

    begin

    DECLARE @SQLDynamic NVARCHAR(MAX)-- STRING QUE CONTENDRA TODO

    DECLARE @FinalDate NVARCHAR(50)=right(@MesAño,4)+'-'+'01-'+left(@MesAño,2)-- creamos el año + el mes + el primer dia

    --obtiene el primer dia del mes;WITH CTE_DAY_Recursive AS

    (SELECT CAST(DATEADD(month, DATEDIFF(month, 0, @FinalDate), 0)  AS date)AS DayDINAMIC --Creamos el primer dia

    UNION ALL

    SELECT DATEADD(DAY,1,DayDINAMIC)--agregamos un dia mas

    FROM CTE_DAY_Recursive

    Where DATEADD(DAY,1,DayDINAMIC)<=CAST(DATEADD(MONTH,DATEDIFF(MONTH,0,@FinalDate)+1,0)-1 AS DATE)--verificamos que no se pase de la fecha del mes)

    SELECT  @SQLDynamic=COALESCE(@SQLDynamic+',','')+'['+CAST(DayDINAMIC    AS nvarchar(20))+']' 

    FROM CTE_DAY_Recursive  --Obtenemos los registros 

    DECLARE @SQLFULL NVARCHAR(MAX)='

    select * from

    (

    select     Id_Colaborador as ''DNI'',   

    Nombre_Colaborador as ''COLABORADOR'',   

    Id_Unidad_Organizativa as ''PROYECTO UO'',

    Nro_Proyecto_Registro as ''PROYECTO ASIGNADO'',   

    Fecha_Registro,   

    sum(Hora_Registro) as ''Hora_Registro''   

    from Sigeri   

    group by Id_Colaborador,Nombre_Colaborador,Id_Unidad_Organizativa,Nro_Proyecto_Registro,Fecha_Registro)s

    pivot(   

    max(Hora_Registro) for[Fecha_Registro] in --(select Fecha_Registro FROM Sigeri)

    ('+@SQLDynamic+') --Le pasamos los registros)p'

    EXEC(@SQLFULL)

    end


    lunes, 21 de octubre de 2019 15:39

Respuestas

  • Prueba

    -- código #1
    ALTER PROCEDURE dbo.PA_Control_horas
          @Fecha1 date, @Fecha2 date  as
    
    begin
    -- comprueba la coherencia de los parámetros
    IF @Fecha1 is null
    or @Fecha2 is null
    or @Fecha1 > @Fecha2
    return -1;

    --
    declare @SQLDynamic NVARCHAR(MAX); -- with CTE_DAY_Recursive as ( SELECT @Fecha1 as DayDINAMIC union all SELECT dateadd (day, +1, DayDINAMIC) from CTE_DAY_Recursive where DayDINAMIC < @Fecha2 ) SELECT @SQLDynamic= coalesce= (@SQLDynamic+',','')+'['+CAST(DayDINAMIC as nvarchar(20))+']' from CTE_DAY_Recursive; -- Obtenemos los registros ...
     

    y

    -- código #2
    declare @Finicio date, @Ffin date;
    set @Finicio= convert (date, '1/10/2019', 103);
    set @Ffin= convert (date, '12/10/2019', 103);
    
    EXECUTE dbo.PA_Control_horas @Finicio , @Ffin;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz lunes, 21 de octubre de 2019 17:13
    • Propuesto como respuesta José Diz lunes, 21 de octubre de 2019 20:18
    • Marcado como respuesta Pablo RubioModerator lunes, 21 de octubre de 2019 20:50
    lunes, 21 de octubre de 2019 17:07
  • Funciona gracias
    lunes, 21 de octubre de 2019 17:49

Todas las respuestas

  • Prueba

    -- código #1
    ALTER PROCEDURE dbo.PA_Control_horas
          @Fecha1 date, @Fecha2 date  as
    
    begin
    -- comprueba la coherencia de los parámetros
    IF @Fecha1 is null
    or @Fecha2 is null
    or @Fecha1 > @Fecha2
    return -1;

    --
    declare @SQLDynamic NVARCHAR(MAX); -- with CTE_DAY_Recursive as ( SELECT @Fecha1 as DayDINAMIC union all SELECT dateadd (day, +1, DayDINAMIC) from CTE_DAY_Recursive where DayDINAMIC < @Fecha2 ) SELECT @SQLDynamic= coalesce= (@SQLDynamic+',','')+'['+CAST(DayDINAMIC as nvarchar(20))+']' from CTE_DAY_Recursive; -- Obtenemos los registros ...
     

    y

    -- código #2
    declare @Finicio date, @Ffin date;
    set @Finicio= convert (date, '1/10/2019', 103);
    set @Ffin= convert (date, '12/10/2019', 103);
    
    EXECUTE dbo.PA_Control_horas @Finicio , @Ffin;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz lunes, 21 de octubre de 2019 17:13
    • Propuesto como respuesta José Diz lunes, 21 de octubre de 2019 20:18
    • Marcado como respuesta Pablo RubioModerator lunes, 21 de octubre de 2019 20:50
    lunes, 21 de octubre de 2019 17:07
  • Funciona gracias
    lunes, 21 de octubre de 2019 17:49