Contar dia,meses e ano

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
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Fala feras!!!

Bom, eu tenho q montar um script que me retorne qts dias, meses e anos tem a partir de uma data até hj, juro que procurei no fórum, mas não encontrei, se alguém puder me dar uma luz, eu agradeço. Um abraço!!
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP

De uma olhada nessa Funcao SQL, depois faça as conversoes necessarias em ano ou em dia ate chegar no que você precisa.

Selecionar tudo

SELECT MONTHS_BETWEEN ('27/12/2009', '25/07/2008') AS DIFERENCA EM MESES -- Devolve a diferença em meses entre as datas "data1" e "data2". 
FROM DATAS; 
Espero que ajude.

Abraço
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Então cara eu conheço essa função, mas o problema é q eu tenho q calcular o valor exato de dias para dividir os meses pelos dias.
Bom, vou explicar o q eu preciso com mais detalhes, é um cadastro de PACIENTES, eu vou pegar a data de Nascimento do Paciente e com o Sysdate eu vou calcular a Idade em dias. Por exemplo: Uma pessoa que nasceu no dia 20/03/1927 está fazendo o cadastro no dia 26/02/2008, então nesse dia ela tem 80anos 11meses e 6dias. então não posso usar valores padrões para meses(30 dias) e ano(365 dias).

Bom, é isso, se alguém souber de como eu posso começar essa função, eu agradeço. Um abraço.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Testei +-, mas aparentemente está retornando os resultados corretamente (não considerei horas, e comparei sempre com sysdate)

Selecionar tudo

select trunc(months_between(trunc(sysdate), dat_nascimento) / 12) anos
     , trunc(mod(months_between(trunc(sysdate), dat_nascimento), 12)) meses
     , round
       (
         (
           (mod(months_between(trunc(sysdate), dat_nascimento), 12))
           -
           trunc(mod(months_between(trunc(sysdate), dat_nascimento), 12))
         ) * ((last_day(trunc(sysdate))) - (trunc(sysdate, 'mm')))
       )
       dias
from
(
  select to_date('19821229', 'yyyymmdd') dat_nascimento
  from dual
) i
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

É isso mesmo q eu preciso, comparando com sysdate.
Eu fiz alguns testes a maioria bateu, mas vou trabalhar na sua lógica aqui e ver se eu consigo melhorá-la, muito obrigado mesmo hein cara, um abraço!!
josegd
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 13 Ago 2015 9:16 pm

Esse código é perfeito para anos e meses, todavia apresenta erros em relação ao cáculo dos dias, caso o mês anterior ao sysdate tenha número de dias diferente de 30, ou seja, caso o mês anterior ao sysdate tenha 28, 29 ou 31 dias.

Resolvi fazendo substituindo a coluna dias por dias2. Vejam como ficou:

Selecionar tudo

select 
       TRUNC(MONTHS_BETWEEN(TRUNC(DT.DATA_2), DT.DATA_1)/12 )                          ANOS, 
       trunc(mod(months_between(trunc(dt.DATA_2),dt.DATA_1), 12))                      meses, 
       round (
               (
                 (mod(months_between(trunc(dt.DATA_2), dt.DATA_1), 12))
                 -
                 (trunc(mod(months_between(trunc(dt.DATA_2), dt.DATA_1), 12)))
               ) 
               * 
               (
                 (last_day(trunc(dt.DATA_2))) - (trunc(dt.DATA_2, 'mm'))
               )
             )                                                                                dias,
             
       (trunc(dt.DATA_2)-(add_months(dt.DATA_1, trunc(months_between(trunc(dt.DATA_2), dt.DATA_1)/12 )*12+trunc(mod(months_between(trunc(dt.DATA_2),dt.DATA_1), 12)) ) )) dias2
       
       /* dias2 difere de dias em razão de o mês anterior ao mês corrente ser mês com número de dias diferente de 30 */
       
       

       
from
       (
         select TO_DATE('20130228', 'yyyymmdd') DATA_1,
                  TO_DATE('20130301', 'yyyymmdd') DATA_2 
         from   dual
       ) dt;

DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Cara, dá uma olhada no tópico:

http://glufke.net/oracle/viewtopic.php?f=3&t=8286
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

Pessoal,

Vale a pena dar uma olhada no link abaixo:

http://glufke.net/oracle/viewtopic.php? ... 992#p38992

Ver a partir da function Z_TIMESTAMP_DIF.

Abs
Responder
  • Informação
  • Quem está online

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