varios valores procedimientos predefinidas numericas funciones funcion español ejemplos devuelve data oracle datetime

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>