none
Gerar calendário com base num intervalo de datas RRS feed

  • Pergunta

  • Olá pessoal,

    Estou precisando gerar numa Grid um conjunto de datas contidas num intervalo definido por um usuário. Existe alguma forma de, no SQL Server 2005, gerar todas as datas envolvidas no critério de um intervalo de datas? Por exemplo, as datas que sejam Mior ou igua a 01/03/2009 e menor ou igual a 10/04/2009.

    Grato,

    Ilano.
    quinta-feira, 26 de março de 2009 18:38

Respostas

  • Boa Tarde,

    Tente o seguinte:

    DECLARE @DataInicial DATETIME, @DataFinal DATETIME  
    SET @DataInicial = '20080310' 
    SET @DataFinal = '20080410' 
     
    ;WITH Nums (Num) As (  
    SELECT 0 UNION ALL SELECT 1 UNION ALL 
    SELECT 2 UNION ALL SELECT 3 UNION ALL 
    SELECT 4 UNION ALL SELECT 5 UNION ALL 
    SELECT 6 UNION ALL SELECT 7 UNION ALL 
    SELECT 8 UNION ALL SELECT 9)  
     
    SELECT DATEADD(D,(N1.Num * 10) + N2.Num,@DataInicial) As Data  
    FROM Nums AS N1 CROSS JOIN Nums AS N2  
    WHERE DATEADD(D,(N1.Num * 10) + N2.Num,@DataInicial) <= @DataFinal 

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    OUTER JOIN com mais de duas tabelas ? Será que está mesmo “certo” ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!514.entry
    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Gabriel Marquez terça-feira, 7 de abril de 2009 16:58
    sexta-feira, 27 de março de 2009 17:09

Todas as Respostas

  • Ilanocf,

    Uma vez aqui no fórum o Marcelo Colla, postou uma função para gerar calendário, acredito que este exemplo ajude:

    1 SET DATEFIRST 7   
    2  
    3 Declare @Calendario Table   
    4  (Idx Int Identity(1,1) ,   
    5   Segunda SmallInt Default null,   
    6   Terça SmallInt Default null,    
    7   Quarta SmallInt Default null,   
    8   Quinta SmallInt Default null,   
    9    Sexta SmallInt Default null,   
    10    Sabado SmallInt Default Null,   
    11    Domingo SmallInt Default Null)  
    12  
    13 Declare @MonthStart Datetime  
    14 Declare @MonthEnd  Datetime  
    15 Declare @Idx  Int 
    16  
    17 set nocount on 
    18  
    19 Select @MonthStart = '01/01/2009' , @MonthEnd = '31/01/2009', @Idx = 1  
    20  
    21 While @MonthStart <= @MonthEnd  
    22 Begin   
    23   Insert into @Calendario Default Values 
    24   While 1=1  
    25      Begin    
    26        Update @Calendario   
    27        Set Segunda = Case When DatePart(WeekDay,@MonthStart) = 2 Then   DatePart(Day,@MonthStart) Else Segunda End,  
    28            Terça   = Case When DatePart(WeekDay,@MonthStart) = 3 Then   DatePart(Day,@MonthStart) Else Terça End,  
    29            Quarta  = Case When DatePart(WeekDay,@MonthStart) = 4 Then   DatePart(Day,@MonthStart) Else Quarta End,  
    30            Quinta  = Case When DatePart(WeekDay,@MonthStart) = 5 Then   DatePart(Day,@MonthStart) Else Quinta End,  
    31            Sexta   = Case When DatePart(WeekDay,@MonthStart) = 6 Then   DatePart(Day,@MonthStart) Else Sexta End,  
    32            Sabado  = Case When DatePart(WeekDay,@MonthStart) = 7 Then   DatePart(Day,@MonthStart) Else Sabado End,  
    33            Domingo = Case When DatePart(WeekDay,@MonthStart) = 1 Then   DatePart(Day,@MonthStart) Else Domingo End 
    34        Where Idx = @Idx And DatePart(Month,@MonthStart) =  DatePart(Month,@MonthEnd)  
    35      
    36       If DatePart(WeekDay,@MonthStart) = 1   
    37        Break  
    38          
    39        Select @MonthStart = Dateadd(Day,1,@MonthStart)   
    40       End   
    41         
    42      Select @MonthStart = Dateadd(Day,1,@MonthStart), @Idx = @Idx + 1  
    43 End 
    44  
    45 Select * From @Calendario  
    46  

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 26 de março de 2009 18:43
  • Pois é só q está retornando o erro:

    The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
    quinta-feira, 26 de março de 2009 19:02
  • Júnior,

    É o seguinte. Aquele código está funcionando, o problema é q eu preciso listar mais de um mês e já não mais no modelo como está. Vou tentar fazer, se eu conseguir postarei aqui.
    quinta-feira, 26 de março de 2009 19:08
  • Bom, a ideia seria praticamente a q está abaixo, só q precisaria fazer com um intervalo de datas:


    CREATE function fnDatas2(@ano smallint, @mes tinyint)
    returns @datas table (data smalldatetime)
    as
    begin
        declare @dataInicial datetime
        declare @dataFinal datetime
        SELECT @dataInicial = cast(@ano as varchar(4))+ '-' +cast(@mes as varchar(2)) + '- 01'
        SELECT @dataFinal = DATEADD(DAY,-1,DATEADD(MONTH,1,@dataInicial))
        WHILE @dataInicial <= @dataFinal
        begin
            insert into @datas values (@dataInicial)
            SELECT @dataInicial = DATEADD(DAY,1,@dataInicial)
        end
        return
    end

    GO

    SELECT * FROM fnDatas2(2007,3)
    quinta-feira, 26 de março de 2009 19:17
  • Boa Tarde,

    Tente o seguinte:

    DECLARE @DataInicial DATETIME, @DataFinal DATETIME  
    SET @DataInicial = '20080310' 
    SET @DataFinal = '20080410' 
     
    ;WITH Nums (Num) As (  
    SELECT 0 UNION ALL SELECT 1 UNION ALL 
    SELECT 2 UNION ALL SELECT 3 UNION ALL 
    SELECT 4 UNION ALL SELECT 5 UNION ALL 
    SELECT 6 UNION ALL SELECT 7 UNION ALL 
    SELECT 8 UNION ALL SELECT 9)  
     
    SELECT DATEADD(D,(N1.Num * 10) + N2.Num,@DataInicial) As Data  
    FROM Nums AS N1 CROSS JOIN Nums AS N2  
    WHERE DATEADD(D,(N1.Num * 10) + N2.Num,@DataInicial) <= @DataFinal 

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    OUTER JOIN com mais de duas tabelas ? Será que está mesmo “certo” ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!514.entry
    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Gabriel Marquez terça-feira, 7 de abril de 2009 16:58
    sexta-feira, 27 de março de 2009 17:09