calculo de dia, mês e ano de nascimento

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Spectreman
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Ter, 29 Mar 2005 4:56 pm
Localização: Tóquio
DOMINANTES, ÀS ORDENS!

Gostaria de saber como faço para calcular atraves de um sql o dia mês e ano de nascimento de um indivíduo,
por exemplo:

Se um individuo nasceu no dia 12/02/2006 e hj e 15/03/2006 ele então tem 3 dias 1 mês e 0 anos de vida.
como eu faço para chegar a este resultado ?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Esse cálculo é sempre meio "problemático", pois os meses podem ter 28, 30 ou 31 dias... :-(
Rique
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 12 Ago 2008 4:45 pm
Localização: Santa Barbara d'Oeste - SP
Rique

Véio isso é fo*a...... quebrei a cabeça pra fazer um PL/SQL.... pelo testes q fiz da certo.........

Selecionar tudo

DECLARE
  V_DIA NUMBER;
  V_mês NUMBER;
  V_ANO NUMBER;
  V_DT1 DATE;
  V_DT2 DATE;
BEGIN
   V_DT1 := TO_DATE('15/03/2006','DD/MM/RRRR'); -- Data atual
   V_DT2 := TO_DATE('12/02/2006','DD/MM/RRRR'); -- Data nascimento
   
   IF V_DT1 >  V_DT2 THEN
      V_DIA := TO_CHAR(V_DT1,'DD') - TO_CHAR(V_DT2,'DD');
      
      V_mês := TO_CHAR(V_DT1,'MM') - TO_CHAR(V_DT2,'MM');
      
      IF V_mês < 0 THEN
         V_ANO := TO_CHAR(V_DT1,'RRRR') - TO_CHAR(V_DT2,'RRRR') - 1;
         V_mês := TO_CHAR(V_DT2,'MM') - ABS(V_mês);
      ELSE
         V_ANO := TO_CHAR(V_DT1,'RRRR') - TO_CHAR(V_DT2,'RRRR');
      END IF;
      
      IF V_DIA < 0 THEN
         V_DIA := TO_CHAR(V_DT2,'DD') - ABS(V_DIA);
      END IF;
         
      DBMS_OUTPUT.PUT_LINE('Hoje é dia '||TO_CHAR(V_DT1,'DD-Mon-RRRR')||' você nasceu em '||TO_CHAR(V_DT2,'DD-Mon-RRRR')||' então você tem '||TO_CHAR(V_ANO)||' ano(s) '||TO_CHAR(V_mês)||' mês(es) e '||V_DIA||' dia(s)');
   ELSE
      DBMS_OUTPUT.PUT_LINE('Você ainda não nasceu!!!');
   END IF;
END;
Rique
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 12 Ago 2008 4:45 pm
Localização: Santa Barbara d'Oeste - SP
Rique

Tinha um erro no código...... acho q acertei....

Selecionar tudo

DECLARE
  V_DIA NUMBER;
  V_mês NUMBER;
  V_ANO NUMBER;
  V_DT1 DATE;
  V_DT2 DATE;
BEGIN
   V_DT1 := SYSDATE; -- Data atual
   V_DT2 := TO_DATE('19/12/2007','DD/MM/RRRR'); -- Data nascimento
   
   IF V_DT1 >  V_DT2 THEN
      V_DIA := TO_CHAR(V_DT1,'DD') - TO_CHAR(V_DT2,'DD');
      
      V_mês := TO_CHAR(V_DT1,'MM') - TO_CHAR(V_DT2,'MM');
      
      IF V_mês < 0 THEN
         V_ANO := TO_CHAR(V_DT1,'RRRR') - TO_CHAR(V_DT2,'RRRR') - 1;
         V_mês := TO_CHAR(V_DT2,'MM') - ABS(V_mês);
      ELSE
         V_ANO := TO_CHAR(V_DT1,'RRRR') - TO_CHAR(V_DT2,'RRRR');
      END IF;
      
      IF V_DIA < 0 THEN
         V_DIA := (TO_CHAR(V_DT2,'DD') - ABS(V_DIA)) + (TO_CHAR(LAST_DAY(V_DT2),'DD') - TO_CHAR(V_DT2,'DD'));
      END IF;
         
      IF TO_CHAR(V_DT1,'DD') < TO_CHAR(V_DT2,'DD') THEN
         V_mês := V_mês - 1;
      END IF;
         
      DBMS_OUTPUT.PUT_LINE('Hoje é dia '||TO_CHAR(V_DT1,'DD-Mon-RRRR')||' você nasceu em '||TO_CHAR(V_DT2,'DD-Mon-RRRR')||' então você tem '||TO_CHAR(V_ANO)||' ano(s) '||TO_CHAR(V_mês)||' mês(es) e '||V_DIA||' dia(s)');
   ELSE
      DBMS_OUTPUT.PUT_LINE('Você ainda não nasceu!!!');
   END IF;
END;



Testa ai!!!!



valeu pela ajuda Ju..... você é um poço de bondade!!!
André Renato
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 02 Set 2008 4:53 pm
Localização: Sorocaba-SP

Tenho algo mais simples e acho que atende:

Selecionar tudo

Select 
(
CASE 
     WHEN Floor(MOD(Months_Between(sysdate, '22/06/1982'), 12)) > 0 THEN
          Floor(Months_Between(sysdate, '22/06/1982')/12) || ' anos e '  || 
          Floor(MOD(Months_Between(sysdate, '22/06/1982'),12)) || ' meses e '||
          Floor(MOD(Months_Between(sysdate, '22/06/1982'),30)) || ' dias'
     ELSE
          Floor(Months_Between(sysdate, '22/06/1982')/12) || ' anos' 
     END
) 
Idade
FROM dual
NaPraia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 88
Registrado em: Sex, 22 Fev 2008 8:24 am
Localização: Floripa - SC

fiz uma pequena alteração no código, julgo que agora esteja um pouco mais correto. executei a consulta e o ano e o mês vieram certos, mas o dia veio errado. veio 2 (eu nasci dia 6 e hoje é dia 4)
ele estava pegando a diferença da do dia do aniversário desse mês (que dá dois dias no meu caso) mas tinha que pegar do mês anterior.

Selecionar tudo

Select
(
CASE
     WHEN Floor(MOD(Months_Between(sysdate, '06/06/1978'), 12)) > 0 THEN
          Floor(Months_Between(sysdate, '06/06/1978')/12) || ' anos e '  ||
          Floor(MOD(Months_Between(sysdate, '06/06/1978'),12)) || ' meses e '||
      abs(Floor(MOD(Months_Between(sysdate, '06/06/1978'),30)) - 30) || ' dias'
     ELSE
          Floor(Months_Between(sysdate, '06/06/1978')/12) || ' anos'
     END
)
Idade
FROM dual
Responder
  • Informação
  • Quem está online

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