valores - Cálculo de la edad de Oracle a partir de la fecha de nacimiento y hoy
oracle data mining español (9)
Quiero calcular la edad actual desde la fecha de nacimiento en mi función de Oracle.
Lo que estoy usando es (Today-Dob)/30/12
, pero esto no es exacto ya que algunos meses tienen 31 días.
Necesito tener la edad correcta con la máxima precisión. ¿Cómo puedo hacer eso?
¿O qué tal esto?
with some_birthdays as
(
select date ''1968-06-09'' d from dual union all
select date ''1970-06-10'' from dual union all
select date ''1972-06-11'' from dual union all
select date ''1974-12-11'' from dual union all
select date ''1976-09-17'' from dual
)
select trunc(sysdate) today
, d birth_date
, floor(months_between(trunc(sysdate),d)/12) age
from some_birthdays;
Edad (años completos) de la Persona:
SELECT
TRUNC(months_between(sysdate, per.DATE_OF_BIRTH) / 12) AS "Age"
FROM PD_PERSONS per
Esto parece considerablemente más fácil de lo que cualquier otra persona ha sugerido.
select sysdate-to_date(''30-jul-1977'') from dual;
Para la lógica de negocios, generalmente encuentro que un número decimal (en años) es útil:
select months_between(TRUNC(sysdate),
to_date(''15-Dec-2000'',''DD-MON-YYYY'')
)/12
as age from dual;
AGE
----------
9.48924731
Y una alternativa sin usar aritmética y números (aunque no hay nada de malo en eso):
SQL> with some_birthdays as
2 ( select date ''1968-06-09'' d from dual union all
3 select date ''1970-06-10'' from dual union all
4 select date ''1972-06-11'' from dual union all
5 select date ''1974-12-11'' from dual union all
6 select date ''1976-09-17'' from dual
7 )
8 select trunc(sysdate) today
9 , d birth_date
10 , extract(year from numtoyminterval(months_between(trunc(sysdate),d),''month'')) age
11 from some_birthdays
12 /
TODAY BIRTH_DATE AGE
------------------- ------------------- ----------
10-06-2010 00:00:00 09-06-1968 00:00:00 42
10-06-2010 00:00:00 10-06-1970 00:00:00 40
10-06-2010 00:00:00 11-06-1972 00:00:00 37
10-06-2010 00:00:00 11-12-1974 00:00:00 35
10-06-2010 00:00:00 17-09-1976 00:00:00 33
5 rows selected.
seleccione (SYSDATE-DOB) / 365 "Age" desde dual
SELECT
TRUNC((SYSDATE - TO_DATE(DOB, ''YYYY-MM-DD''))/ 365.25) AS AGE_TODAY FROM DUAL;
Esto es fácil y directo al grano.
SQL>select to_char(to_date(''19-11-2017'',''dd-mm-yyyy''),''yyyy'') - to_char(to_date(''10-07-1986'',''dd-mm-yyyy''),''yyyy'') year,
to_char(to_date(''19-11-2017'',''dd-mm-yyyy''),''mm'') - to_char(to_date(''10-07-1986'',''dd-mm-yyyy''),''mm'') month,
to_char(to_date(''19-11-2017'',''dd-mm-yyyy''),''dd'') - to_char(to_date(''10-07-1986'',''dd-mm-yyyy''),''dd'') day from dual;
YEAR MONTH DAY
---------- ---------- ----------
31 4 9
SQL> select trunc(months_between(sysdate,dob)/12) year,
2 trunc(mod(months_between(sysdate,dob),12)) month,
3 trunc(sysdate-add_months(dob,trunc(months_between(sysdate,dob)/12)*12+trunc(mod(months_between(sysdate,dob),12)))) day
4 from (Select to_date(''15122000'',''DDMMYYYY'') dob from dual);
YEAR MONTH DAY
---------- ---------- ----------
9 5 26
SQL>