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 ?
calculo de dia, mês e ano de nascimento
- Spectreman
- Rank: Programador Sênior
- Mensagens: 48
- Registrado em: Ter, 29 Mar 2005 4:56 pm
- Localização: Tóquio
DOMINANTES, ÀS ORDENS!
- dr_gori
- 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
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...
-
- 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.........
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;
-
- 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....
Testa ai!!!!
valeu pela ajuda Ju..... você é um poço de bondade!!!
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!!!
-
- 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:
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
-
- 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.
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.
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
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 27 visitantes