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
  

Mensagemem Qua, 15 Mar 2006 10:23 am

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 ?
Spectreman
Localização: Tóquio

DOMINANTES, ÀS ORDENS!

Mensagemem Ter, 02 Set 2008 3:06 pm

Esse cálculo é sempre meio "problemático", pois os meses podem ter 28, 30 ou 31 dias... :-(
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qua, 03 Set 2008 12:24 pm

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


Código: Selecionar todos
DECLARE
  V_DIA NUMBER;
  V_MES 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_MES := TO_CHAR(V_DT1,'MM') - TO_CHAR(V_DT2,'MM');
     
      IF V_MES < 0 THEN
         V_ANO := TO_CHAR(V_DT1,'RRRR') - TO_CHAR(V_DT2,'RRRR') - 1;
         V_MES := TO_CHAR(V_DT2,'MM') - ABS(V_MES);
      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_MES)||' mês(es) e '||V_DIA||' dia(s)');
   ELSE
      DBMS_OUTPUT.PUT_LINE('Você ainda não nasceu!!!');
   END IF;
END;
Rique
Localização: Santa Barbara d'Oeste - SP

Rique

Mensagemem Qua, 03 Set 2008 2:48 pm

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


Código: Selecionar todos
DECLARE
  V_DIA NUMBER;
  V_MES 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_MES := TO_CHAR(V_DT1,'MM') - TO_CHAR(V_DT2,'MM');
     
      IF V_MES < 0 THEN
         V_ANO := TO_CHAR(V_DT1,'RRRR') - TO_CHAR(V_DT2,'RRRR') - 1;
         V_MES := TO_CHAR(V_DT2,'MM') - ABS(V_MES);
      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_MES := V_MES - 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_MES)||' 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!!!
Rique
Localização: Santa Barbara d'Oeste - SP

Rique

Mensagemem Qui, 04 Set 2008 10:52 am

Tenho algo mais simples e acho que atende:

Código: Selecionar todos
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
André Renato
Localização: Sorocaba-SP

Mensagemem Qui, 04 Set 2008 5:01 pm

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.

Código: Selecionar todos
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
NaPraia
Localização: Floripa - SC


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


    Voltar para SQL

    Quem está online

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