Problema calculo entre datas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
rsalbano
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Seg, 11 Jul 2011 9:55 am
Localização: Curitiba

Olá,

Estou executando o seguinte select:

Selecionar tudo

select  CONTRATO,
          sysdate AS DATA_HOJE,  
          dta_venc_parcela AS DATA_VENC
from   PARCELAS
where contrato NOT IN (SELECT contrato FROM TEMP_CONTRATO) 
AND    dta_pagto_parcela IS NULL
AND    to_number( to_date(sysdate, 'DD/MM/YYYY') - to_date(dta_venc_parcela, 'DD/MM/YYYY') ) between 1 and 60
order by num_parcela;
Esta aparecendo o seguinte erro: "(full) year must be between -4713 and +9999, and not be 0".
Já tentei sem o to_number: (to_date(sysdate, 'DD/MM/YYYY') - to_date(dta_venc_parcela, 'DD/MM/YYYY') )

Quando retiro a condição do calculo e coloco o calculo no select, funciona.

Selecionar tudo

select  CONTRATO,
          sysdate AS DATA_HOJE,  
          dta_venc_parcela AS DATA_VENC,
          to_number( to_date(sysdate, 'DD/MM/YYYY') - to_date(dta_venc_parcela, 'DD/MM/YYYY') ) as dias
from   PARCELAS
where contrato NOT IN (SELECT contrato FROM TEMP_CONTRATO) 
AND    dta_pagto_parcela IS NULL
order by num_parcela;
Estou convertando para DD/MM/YYYY, pois os campos tem hora e preciso desconsiderar a hora.

Se alguém tiver uma dica, vai ajudar muito.

Ricardo.

OBS: Favor, colocar códigos entre as tags code.
Avatar do usuário
madmax
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 293
Registrado em: Qua, 13 Dez 2006 5:02 pm
Localização: São Paulo
Contato:
________________________________
Douglas - Madmax.

Ricardo.

Veja se esse exemplo simples te ajuda:

Selecionar tudo

select 'DOUGLAS' FROM DUAL 
WHERE (select data_final - data_incial dias  
        from (select to_date('01/09/2009', 'dd/mm/yyyy') data_incial  
                     , to_date('21/09/2009', 'dd/mm/yyyy') data_final  
                from Dual))  between 1 and 60 
Espero ter ajudado.

Abs.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Qual o data type da coluna "dta_venc_parcela"? Data?

Se for isso, não faz to_date, faz trunc(dta_venc_parcela).

Quando você usa to_date ele faz um to_char implícito e depois tenta jogar de volta para data, pode dar todo tipo de bug nisso.

Além disso o código está tentando trabalhar número - data, o que não é recomendado: deixe os dois em data ou os 2 em número antes de calcular.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Ricardo,

Você está formatando uma data para data e isso pode gerar alguns erros.

Observe que você faz to_date(sysdate....

sysdate já é data, então, você teria qeu converter para texto (to_char) e depois para data

Selecionar tudo

select  CONTRATO,
          sysdate AS DATA_HOJE,  
          dta_venc_parcela AS DATA_VENC
from   PARCELAS
where contrato NOT IN (SELECT contrato FROM TEMP_CONTRATO) 
AND    dta_pagto_parcela IS NULL
AND    to_number( to_date(to_char(sysdate, 'DD/MM/YYYY'), 'DD/MM/YYYY') - to_date(to_char(dta_venc_parcela, 'DD/MM/YYYY'), 'DD/MM/YYYY') ) between 1 and 60
order by num_parcela;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes