- Este tópico contém 8 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 9 meses atrás por
Rodrigo Mesquita.
-
AutorPosts
-
15 de junho de 2009 às 9:58 pm #87300
facc
ParticipanteBoa 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') + 1Mas 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;15 de junho de 2009 às 10:16 pm #87303Ishii
ParticipanteOlá,
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
15 de junho de 2009 às 11:02 pm #87306facc
ParticipanteAndei 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)))16 de junho de 2009 às 3:48 pm #87316Rodrigo Mesquita
ParticipantePara 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’)16 de junho de 2009 às 4:30 pm #87317Marcio68Almeida
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 dual16 de junho de 2009 às 5:11 pm #87319facc
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?16 de junho de 2009 às 5:31 pm #87321Marcio68Almeida
ParticipanteSe 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.16 de junho de 2009 às 5:38 pm #87322facc
ParticipanteFuncionou. Muito obrigado.
16 de junho de 2009 às 9:35 pm #87326Rodrigo 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.
-
AutorPosts
- Você deve fazer login para responder a este tópico.