Ir para conteúdo
Fórum Script Brasil
  • 0

Tratativa de meses


ricardo.bezerra

Pergunta

Bom dia!

 

Tenho um script automatizado que, embora retorne o que preciso, por trazer informações d-1 e d-2, na virada do mês, não gera a informação desejada.

 

Como posso corrigir esse problema?

 

Agradeço à todos, desde já.

 

Script utilizado:

 

SET @dataI = now(); 
SET @dataA = now()-1; 
-- Esta primeira query extrai os dados referente a SPOT 
SELECT 
  @dataI AS 'Data Referencia', 
       CASE 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 1 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 5 
          THEN 'A- 1~5' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 6 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 15 
          THEN 'B- 6~15' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 16 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 40 
          THEN 'C- 16~40' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 41 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 90 
          THEN 'D- 41~90' 
          WHEN DATEDIFF(@dataI, data_vencimento) > 90 
          THEN 'E- >90' 
          ELSE 'NULL' 
       END 
          AS 'Faixa de atraso', 
       FORMAT( SUM( 
             CASE 
                WHEN ( (data_pagamento > @dataI) 
               OR data_pagamento IS NULL 
               OR baixados = 'NÃO') 
                THEN valor_operacao 
                ELSE 0 
             END), 
          2, 'de_DE') AS 'Saldo', 
       FORMAT( SUM( 
             CASE 
                WHEN (data_pagamento =@dataI AND parcelado = 0) 
                THEN valor_operacao 
                ELSE 0 
             END), 
          2,'de_DE')AS 'Pagamentos', 
          FORMAT( SUM( 
             CASE 
                WHEN (data_pagamento =@dataI AND parcelado = 1) 
                THEN valor_operacao ELSE 0 
             END), 
          2, 'de_DE') AS 'Parcelado', 
       FORMAT(SUM(ant.Saldo_Anterior),2,'de_DE') AS 'Saldo Anterior', 
           
       FORMAT( 
            SUM( 
               CASE 
                  WHEN (data_pagamento >@dataI 
                        OR baixados = 'NÃO') 
                  THEN valor_operacao 
                  ELSE 0 
               END) 
          - Sum(ant.Saldo_Anterior) 
          + SUM( 
               CASE 
                  WHEN (data_pagamento = @dataI) 
                  THEN 
                     valor_operacao 
                  ELSE 
                     0 
               END), 
          2, 'de_DE') AS 'Rolagem' 
           
 FROM tb_relatorio_transacao_diario 
  
 LEFT JOIN ( 
   SELECT idt_operacao, 
         FORMAT( SUM( CASE WHEN (data_pagamento >@dataA) 
                 OR data_pagamento IS NULL 
                 OR baixados = 'NÃO' 
                  THEN valor_operacao 
                  ELSE 0 
               END), 2, 'de_DE') 
            AS 'Saldo_Anterior' 
   FROM tb_relatorio_transacao_diario 
    
   WHERE repasse_bloqueado = 'NãO' 
         AND data_vencimento <= @dataA 
         AND produto = 'SPOT' 
         AND data_cancelamento IS NULL 
         AND DATEDIFF(@dataA,data_vencimento) > 0 
  GROUP BY idt_operacao) ant 
  ON ant.idt_operacao = tb_relatorio_transacao_diario.idt_operacao 
          
       
 WHERE repasse_bloqueado = 'NãO' 
       AND data_vencimento <= @dataI 
       AND produto = 'SPOT' 
       AND data_cancelamento IS NULL 
       AND DATEDIFF(@dataI,data_vencimento) > 0 
        
GROUP BY 
(CASE 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 1 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 5 
          THEN 'a1~5' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 6 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 15 
          THEN 'b6~15' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 16 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 40 
          THEN 'c16~40' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 41 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 90 
          THEN 'd41~90' 
          WHEN DATEDIFF(@dataI, data_vencimento) > 90 
          THEN 'e>90' 
          ELSE 'NULL' 
       END); 
-- Esta segunda query retorna dados dos parcelados 
SELECT 
  @dataI AS 'Data Referencia', 
       CASE 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 1 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 5 
          THEN 'A- 1~5' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 6 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 15 
          THEN 'B- 6~15' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 16 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 40 
          THEN 'C- 16~40' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 41 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 90 
          THEN 'D- 41~90' 
          WHEN DATEDIFF(@dataI, data_vencimento) > 90 
          THEN 'E- >90' 
          ELSE 'NULL' 
       END 
          AS 'Faixa de atraso', 
       FORMAT( SUM( 
             CASE 
                WHEN ( (data_pagamento > @dataI) 
               OR data_pagamento IS NULL 
               OR baixados = 'NÃO') 
                THEN valor_operacao 
                ELSE 0 
             END), 
          2, 'de_DE') AS 'Saldo', 
       FORMAT( SUM( 
             CASE 
                WHEN (data_pagamento = @dataI AND parcelado = 0) 
                THEN valor_operacao 
                ELSE 0 
             END), 
          2,'de_DE')AS 'Pagamentos', 
          FORMAT( SUM( 
             CASE 
                WHEN (data_pagamento =@dataI AND parcelado = 1) 
                THEN valor_operacao ELSE 0 
             END), 
          2, 'de_DE') AS 'Parcelado', 
       FORMAT(SUM(ant.Saldo_Anterior),2,'de_DE') AS 'Saldo Anterior', 
           
       FORMAT( 
            SUM( 
               CASE 
                  WHEN (data_pagamento >@dataI 
                        OR baixados = 'NÃO') 
                  THEN valor_operacao 
                  ELSE 0 
               END) 
          - Sum(ant.Saldo_Anterior) 
          + SUM( 
               CASE 
                  WHEN (data_pagamento = @dataI) 
                  THEN 
                     valor_operacao 
                  ELSE 
                     0 
               END), 
          2, 'de_DE') AS 'Rolagem' 
           
 FROM tb_relatorio_transacao_diario 
  
 LEFT JOIN ( 
   SELECT idt_operacao, 
         FORMAT( SUM( CASE WHEN (data_pagamento >@dataA) 
                 OR data_pagamento IS NULL 
                 OR baixados = 'NÃO' 
                  THEN valor_operacao 
                  ELSE 0 
               END), 2, 'de_DE') 
            AS 'Saldo_Anterior' 
   FROM tb_relatorio_transacao_diario 
    
   WHERE repasse_bloqueado = 'NãO' 
         AND data_vencimento <= @dataA 
         AND produto = 'SPOT' 
         AND data_cancelamento IS NULL 
         AND DATEDIFF(@dataA,data_vencimento) > 0 
  GROUP BY idt_operacao) ant 
  ON ant.idt_operacao = tb_relatorio_transacao_diario.idt_operacao 
          
       
 WHERE repasse_bloqueado = 'NãO' 
       AND data_vencimento <= @dataI 
       AND produto <> 'SPOT' 
       AND data_cancelamento IS NULL 
       AND DATEDIFF(@dataI,data_vencimento) > 0 
        
GROUP BY 
(CASE 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 1 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 5 
          THEN 'a1~5' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 6 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 15 
          THEN 'b6~15' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 16 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 40 
          THEN 'c16~40' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 41 
               AND (DATEDIFF(@dataI, data_vencimento)) <= 90 
          THEN 'd41~90' 
          WHEN DATEDIFF(@dataI, data_vencimento) > 90 
          THEN 'e>90' 
          WHEN DATEDIFF(@dataI, data_vencimento) >= 90 
          THEN 'f>90' 
          ELSE 'NULL' 
       END);

 

Quando falo virada do mês quero dizer o seguinte:

 

pega a data de hoje, por exemplo e a de ontem...então será nesse exemplo dias 21/10 e 20/10..ai vai até dia 31/10 e 30/10..quando entrar em novembro, pega dia 01/11 e "não traz" 31/10...só traz o dia 01/11, ou seja, ele isola mês a mês, porém, no mês retrasado (agosto) que tivemos 31 dias..ele entendeu que tinha 30 dias mesmo..então ele está separando mês a mês mas mantendo sempre 30 dias para cada mês..

Ou seja, também não está rolando identificação se o mês têm 31, 30, 29 (ano bissexto) ou 28 dias.

Se alguém puder dar uma direção ou souber de algum link que possa ajudar-me, já agradeço demais.

Muito obrigado.

Abraços

Ricardo.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...