Pular para o conteúdo
  • Este tópico contém 8 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 9 meses atrás por Rodrigo Mesquita.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #87300
    facc
    Participante

      Boa tarde.

      Como faço para pegar registros sempre com um mês de antecedência?

      Pensei em fazer assim
      SELECT *
      FROM CYBELAR_NROSORTE NRO
      WHERE LOJA IS NULL
      AND FLGUSO = 0
      AND EXTRACT(MONTH FROM MES_ANO) = TO_CHAR(SYSDATE, 'MM') + 1

      Mas pensei que pode dar erro qndo chegar em dezembro, pois irá somar mais um, indo para o 13 mês. Como fazer para ele reconhecer que quero Janeiro?

      Estou enviando a procedure onde irei precisar acrescentar isso

      CREATE OR REPLACE PROCEDURE CYBELAR_RES_NRSORTE(P_LOJA IN varchar2,
      P_PDV IN VARCHAR2,
      P_QTD IN NUMBER,
      P_NROSORTE OUT varchar2,
      P_CONFIRMA OUT NUMBER) is
      /***********************************************************
      * PROCEDURE : CYBELAR_RES_NRSORTE *
      * OBJETIVO : RESERVAR O NRSORTE P/ A LOJA E "ESCONDER" *
      DAS DEMAIS LOJAS E OUTRAS RESERVAS *
      * CRIACAO : 08/05/2009 *
      * VERSAO : 1.0 *
      * AUTOR : FABIO A. CAMPOS CRUZ - *
      ***********************************************************/
      look_error exception;

      pragma exception_init(look_error, -54);

      retorno_nrsorte varchar2(5);
      ListaNrsorte varchar2(1000);
      RETORNOCONFIRMA NUMBER;
      erro_int varchar2(1000);
      vc_dir_log varchar2(100);
      vc_id_log varchar2(7) := 'CYBELAR';
      vc_arq_log varchar2(60) := 'NRSORTE_' || to_char(sysdate, 'DDMMYY') ||
      '.LOG';
      vc_nome_pgm varchar2(50) := 'PDV_NRSORTE';
      vu_file utl_file.file_type;

      VN_QTREG NUMBER := 0;

      begin
      BEGIN
      SELECT PINT_NM_DIRETORIO_LOG
      INTO VC_DIR_LOG
      FROM GEMCO_PARAMETRO_INTERFACE PINT, GEMCO_SISTEMA SIST
      WHERE PINT.PINT_CD_SISTEMA = SIST.SIST_CD_SISTEMA
      AND SIST.SIST_DS_SISTEMA = vc_nome_pgm;
      EXCEPTION
      -- SE NAO EXISTIR INFORMAR O DIRETORIO ONDE DEVERA SER
      -- GERADO O LOG DE OCORRENCIAS
      WHEN NO_DATA_FOUND THEN
      VC_DIR_LOG := '/integra/Log';
      WHEN TOO_MANY_ROWS THEN
      VC_DIR_LOG := '/integra/Log';
      WHEN OTHERS THEN
      VC_DIR_LOG := '/integra/Log';
      END;

      begin
      vu_file := utl_file.fopen(vc_dir_log, vc_arq_log, 'r');
      utl_file.fclose(vu_file);
      exception
      when others then
      sp_int_gemco_gera_log('INICIO DO LOG',
      vc_dir_log,
      vc_id_log,
      vc_arq_log,
      sysdate,
      null,
      vc_nome_pgm,
      0,
      0,
      0);
      end;

      FOR rNrSorte IN 1 .. P_QTD loop
      BEGIN
      LOCK TABLE CYBELAR_NROSORTE IN EXCLUSIVE MODE;

      SELECT NRO.NROSORTE
      INTO retorno_nrsorte
      FROM CYBELAR_NROSORTE NRO
      WHERE LOJA IS NULL
      AND FLGUSO = 0
      AND ROWNUM <= 1 FOR UPDATE NOWAIT; ListaNrsorte := retorno_nrsorte || '|' || ListaNrsorte; UPDATE CYBELAR_NROSORTE SET FLGUSO = 1, LOJA = P_LOJA, PDV_CAIXA = P_PDV, DATANRSORTE = SYSDATE WHERE NROSORTE = retorno_nrsorte; COMMIT; EXCEPTION WHEN look_error THEN NULL; END; RETORNOCONFIRMA := 0; VN_QTREG := VN_QTREG + 1; end loop; COMMIT; IF VN_QTREG = 0 THEN ERRO_INT := 'ERRO AO RESERVAR O NRSORTE (' || P_NROSORTE || ') PARA A LOJA ' || P_LOJA || '.'; RETORNOCONFIRMA := 1; ELSE ERRO_INT := 'RESERVADO COM SUCESSO (' || ListaNrsorte || '). LOJA ' || P_LOJA; RETORNOCONFIRMA := 0; END IF; sp_int_gemco_gera_log('GERA LOG', vc_dir_log, vc_id_log, vc_arq_log, sysdate, erro_int, vc_nome_pgm, 0, 0, 0); sp_int_gemco_gera_log('FIM LOG', vc_dir_log, vc_id_log, vc_arq_log, sysdate, null, vc_nome_pgm, 0, 0, 0); COMMIT; P_CONFIRMA := RETORNOCONFIRMA; P_NROSORTE := ListaNrsorte; end cybelar_res_nrsorte;

      #87303
      Ishii
      Participante

        Olá,

        Use o ADD_MONTHS. Mas converta para o mês/ano correto.

        Seria algo assim:


        Select ADD_MONTHS (trunc(sysdate,'MM'), 1) from dual

        []s Ishii

        #87306
        facc
        Participante

          Andei fazendo uns testes e cheguei nessa conclusão, vamos ver se minha ideia está correta.

          SELECT NRO.NROSORTE
          FROM CYBELAR_NROSORTE NRO
          WHERE LOJA IS NULL
          AND FLGUSO = 0
          AND EXTRACT(MONTH FROM MES_ANO) =
          EXTRACT(MONTH FROM(ADD_MONTHS(SYSDATE, 1)))

          #87316
          Rodrigo Mesquita
          Participante

            Para pegar os dados do mes anterior vc pode fazer assim:

            SELECT NRO.NROSORTE
            FROM CYBELAR_NROSORTE NRO
            WHERE LOJA IS NULL
            AND FLGUSO = 0
            AND to_char(MES_ANO,’mmyyyy’) = to_char(add_months(sysdate,-1),’mm’)||to_char(sysdate,’yyyy’)

            #87317
            Marcio68Almeida
            Participante

              [quote=”RodrigoMesquita”:8b7n3jby] AND to_char(MES_ANO,’mmyyyy’) = to_char(add_months(sysdate,-1),’mm’)||to_char(sysdate,’yyyy’)[/quote]
              Se for fazer assim, você terá problemas no mês de janeiro…
              Faltou tirar um mês na hora de resgatar o ano também…
              select to_char (add_months (sysdate,-1), 'mm') || to_char (add_months (sysdate, -1), 'yyyy') from dual

              #87319
              facc
              Participante

                [quote=”Marcio68Almeida”:3beg1gf3][quote=”RodrigoMesquita”:3beg1gf3] AND to_char(MES_ANO,’mmyyyy’) = to_char(add_months(sysdate,-1),’mm’)||to_char(sysdate,’yyyy’)[/quote]
                Se for fazer assim, você terá problemas no mês de janeiro…
                Faltou tirar um mês na hora de resgatar o ano também…
                select to_char (add_months (sysdate,-1), 'mm') || to_char (add_months (sysdate, -1), 'yyyy') from dual[/quote]

                Mas se eu fizer isso, vai dar erro no que eu quero. Exemplo:

                Compro uma numeração hoje (Junho) tenho direito a concorrer nos sorteios do mês Julho, ou seja, um mês a frente
                se fizer desse jeito
                [code] SELECT NRO.NROSORTE
                INTO retorno_nrsorte
                FROM CYBELAR_NROSORTE NRO
                WHERE LOJA IS NULL
                AND FLGUSO = 0
                AND TO_CHAR(MES_ANO, ‘MM’) =
                TO_CHAR(ADD_MONTHS(SYSDATE, 1), ‘MM’)
                AND ROWNUM <= 1 [code]
                consigo o que eu quero, porem qndo chegar Dezembro, tem direito aos sorteios de Janeiro, como faço para ele reconhecer que quero um ano a mais?

                #87321
                Marcio68Almeida
                Participante

                  Se você comparar apena mês, depois de um ano você vai começar a ter um problema simples, de que ANO é este mês que estou comparando ???
                  Por isso você tem que comparar mês e ano.
                  O mais simples é :
                  TO_CHAR (mes_ano, 'yyyymm') = TO_CHAR (add_months (sysdate + 1), 'yyyymm')
                  Assim a consulta está completa e correta.

                  #87322
                  facc
                  Participante

                    Funcionou. Muito obrigado.

                    #87326
                    Rodrigo Mesquita
                    Participante

                      [quote=”Marcio68Almeida”:278nuaec][quote=”RodrigoMesquita”:278nuaec] AND to_char(MES_ANO,’mmyyyy’) = to_char(add_months(sysdate,-1),’mm’)||to_char(sysdate,’yyyy’)[/quote]
                      Se for fazer assim, você terá problemas no mês de janeiro…
                      Faltou tirar um mês na hora de resgatar o ano também…
                      select to_char (add_months (sysdate,-1), 'mm') || to_char (add_months (sysdate, -1), 'yyyy') from dual[/quote]

                      é verdade Marcio, não prestei atenção a esse detalhe. A sua sugestão ai em cima ficou melhor.

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.