none
Cursor/While Trazer os dias da semana [formato data] entre duas datas range de [inicio] e [fim] RRS feed

  • Pergunta

  • Pessoal bom dia,

    Estou tentando expandir minha tabela da seguitne forma:

    Cod_Empresa	Nr_Voo	Nr_Semana	Início_Operação	         Fim_Operação
    AZU	            2470	       7	      	      2018-09-16 00:00:00.000	 2018-10-07 23:59:59.000

    Tenho uma linha onde identifico que meu range inicio e fim é do dia 2018-09-16 [Inicio_Operação] até 2018-10-07 [Fim_Operação]

    Porém a minha coluna do Nr_Semana é 7 que significa Domingos

    Quero expandir em um cursor esta linha de forma que me traga a data, tem que ser no formato data, todos os Domingos entre o Inicio e o Fim da operação.

    Ficará um resultado desta forma:

    Cod_Empresa	    Nr_Voo	Nr_Semana	    week
    AZU	                     2470	       7	                9/16/2018
    AZU		             2470	       7                       9/23/2018
    AZU		             2470	       7                       9/30/2018
    AZU		             2470	       7                       10/7/2018

    Eu digo cursor porque o volume de linhas é grande e serão vistos todos os dias da semana de 1 a 7, começando segunda 1 terminando domingo 7. 

    Então imaginei algo em que o cursor vai lendo a data inicio e a data fim, encontrou os dados correspondentes do dia e numero da semana, vai la e insere o dado numa tabela esse dado.

    É possível?

    O que eu achei foram funções para trazer a diferença de dias, ou contar quantos sabado tenho dentro do range. 

    Estou trabalhando com algo assim:

    SET DATEFIRST 1 
    
    DECLARE @Siros varchar(4)
    
    Set @Siros = (SELECT [Nr_Semana]
      FROM [dbo].[tb_Siros] )
    
    DECLARE @DataIni AS Date  
    DECLARE @DataFim AS Date 
    Set @DataIni= Getdate()
    Set @DataFim= DateAdd(day,350,@DataIni)
    
    CREATE TABLE #sirostemp (
    	[Cod_Empresa] [varchar](3) NULL,
    	[Nr_Voo] [varchar](10) NULL,
    	[Nr_Semana] [int] NULL,
    	[Início_Operação] [datetime] NULL,
    	[Fim_Operação] [datetime] NULL,
    	[Cod_Origem] [varchar](4) NULL,
    	[Cod_Destino] [varchar](4) NULL,
    	[Horário_Partida] [time](7) NULL,
    	[Horário_Chegada] [time](7) NULL,
    	[Capture_Datetime] [datetime] NULL
    ) ON [PRIMARY]
    
    While @DataIni < @DataFim
    
    
    
           Begin
    
           Set @Siros = (SELECT Top 1 [Nr_Semana]
           FROM [dbo].[tb_Siros]
           Where Início_Operação <= @DataIni
           and Fim_Operação >= @DataIni
           Order by Início_Operação desc)
    
           Insert Into  #sirostemp
           SELECT [Cod_Empresa]
          ,[Nr_Voo]
          ,[Nr_Semana]
          ,[Início_Operação]
          ,[Fim_Operação]
          ,[Cod_Origem]
          ,[Cod_Destino]
          ,[Horário_Partida]
          ,[Horário_Chegada]
          ,[Capture_Datetime]
           ,@DataIni as DepDate
           
             FROM [dbo].[tb_Siros]  
    
             Where 
             [Nr_Semana] = @Siros

    Obrigada
















    terça-feira, 17 de julho de 2018 12:32

Respostas

Todas as Respostas

  • Bom dia,

    Segue uma sugestão para testes utilizando uma CTE recursiva:

    with CTE_Rec as
    (
        select
            Cod_Empresa,
            Nr_Voo,
            Nr_Semana,
            Início_Operação as [week],
            Fim_Operação       
        from Tabela
        
        union all
        
        select
            Cod_Empresa,
            Nr_Voo,
            Nr_Semana,
            dateadd(day, 7, [week]),
            Fim_Operação
        from CTE_Rec
        where
            dateadd(day, 7, [week]) <= Fim_Operação    
    )
    
    select
        Cod_Empresa,
        Nr_Voo,
        Nr_Semana,
        [week]
    from CTE_Rec

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 17 de julho de 2018 12:55
  • olá,

    aparentemente o comando PIVOT pode resolver teu problema dê olha neste link:

    https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318

    prazer.

    • Editado Timóteo Nkawa terça-feira, 17 de julho de 2018 13:38
    • Sugerido como Resposta Timóteo Nkawa terça-feira, 17 de julho de 2018 13:39
    terça-feira, 17 de julho de 2018 13:38
  • Consegui resolver com o cursor

    Muito obrigadaaa a todos

    terça-feira, 17 de julho de 2018 16:40
  • Consegui resolver com o cursor

    Thaís, uma observação: geralmente soluções com o uso de cursor são de execução lenta. O ideal é construir soluções que trabalhem com conjunto de dados (set-based). Além da forma sugerida pelo "gapimex", outra forma é através de tabela auxiliar de números.

    Para detalhes sobre o uso de cursor, pode pesquisar por set based vs cursor.


    [Linked In]   [e-mail]       José Diz     Belo Horizonte, MG - Brasil


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

    Oi Jose,

    O que eu estou fazendo é

    
    SET DATEFIRST 1 
    
    DECLARE @Siros int
    
    Set @Siros = (SELECT  Nr_Semana
      FROM [Planejamento].[dbo].[tb_Siros_temp]
      )
    
    
    BEGIN TRY DROP TABLE #sirostemp END TRY BEGIN CATCH END CATCH
    
    --SELECT * INTO #sirostemp FROM [Planejamento].[dbo].[tb_Siros]
    --WHERE Nr_Voo = '2883'
    --AND Nr_Semana = 1 
    --AND Cod_Origem = 'SBFZ'
    --AND Cod_Destino = 'SBRF'
    --AND Cod_Empresa = 'AZU'
    
    CREATE TABLE #sirostemp (
    	[Cod_Empresa] [varchar](3) NULL,
    	[Nr_Voo] [varchar](10) NULL,
    	[Nr_Semana] [int] NULL,
    	[Início_Operação] [datetime] NULL,
    	[Fim_Operação] [datetime] NULL,
    	[Cod_Origem] [varchar](4) NULL,
    	[Cod_Destino] [varchar](4) NULL,
    	[Horário_Partida] [time](7) NULL,
    	[Horário_Chegada] [time](7) NULL,
    	[calendar_date] [datetime] NULL,
    	[day_of_week] [int] NULL
    ) ON [PRIMARY]
    
    
    DECLARE @DataIni AS Date  
    DECLARE @DataFim AS Date 
    Set @DataIni= Getdate()
    Set @DataFim= DateAdd(day,350,@DataIni)
    
    
    While @DataIni < @DataFim
    
          Begin
    
    	   Set @Siros = (SELECT Top 1 NR_Semana
           FROM [Planejamento].[dbo].[tb_Siros]
           Where Início_Operação <= @DataIni
           and Fim_Operação >= @DataIni
           Order by Início_Operação desc)
    
           Insert Into  #sirostemp
    		   SELECT [Cod_Empresa]
    		  ,[Nr_Voo]
    		  ,[Nr_Semana]
    		  ,[Início_Operação]
    		  ,[Fim_Operação]
    		  ,[Cod_Origem]
    		  ,[Cod_Destino]
    		  ,[Horário_Partida]
    		  ,[Horário_Chegada]
    		  ,dc.[calendar_date]
    		  ,dc.[day_of_week]
    			 FROM #sirostemp ST
    			  LEFT JOIN [Planejamento].[dbo].[date_calendar] DC ON dc.[day_of_week] = ST.Nr_Semana
    			 Where dc.[day_of_week] = ST.Nr_Semana
    			   and ST.Nr_Semana = @Siros
    			  and dc.[calendar_date] between ST.[Início_Operação] and ST.[Fim_Operação]
    		      
      
    	  Set @DataFim= DateAdd(day,350,@DataIni)
    
      end


    De modo que trave 350 dias.

    Ainda esá em um loop infinito, estou tentando acertar.

    Obrigada pela dica



    terça-feira, 17 de julho de 2018 19:22
  • Era verificar quais dias da semana entre o período inicio e fim faz-se operação

    Sendo 

    Nr_Semana = 7, temos vôos aos domingos 

    Entre as datas  inicio e fim de operação

    de tal vôo, tal segmento.

    Depois comparar com um mesmo arquivo da data de ontem fazendo um merge e enxergar onde houve movimentação. 

    As datas continuas é verificar operações de hoje e até 350 dias para frente

    Porque o arquivo onde inputamos os dados pegam dados de vôos que vão acontecer em até 1000 dias para frente 

    terça-feira, 17 de julho de 2018 20:18