Pregunta

Quiero calcular la edad actual de 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 para obtener la edad correcta con la máxima precisión. ¿Cómo puedo hacer eso?

¿Fue útil?

Solución

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>

Otros consejos

En la lógica de negocio normalmente encontrar 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
SELECT 
TRUNC((SYSDATE - TO_DATE(DOB, 'YYYY-MM-DD'))/ 365.25) AS AGE_TODAY FROM DUAL;

Esto es fácil y directo al grano.

Y una alternativa sin utilizar ningún aritmética y los números (aunque no hay nada malo en ello):

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.

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;

Esto parece considerablemente más fácil que lo que nadie ha sugerido

select sysdate-to_date('30-jul-1977') from dual; 

Edad (años completos) de la persona:

SELECT
  TRUNC(months_between(sysdate, per.DATE_OF_BIRTH) / 12) AS "Age"
FROM PD_PERSONS per
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

Puede probar

SELECT ROUND((SYSDATE - TO_DATE('12-MAY-16'))/365.25, 5) AS AGE from DUAL;

Se puede configurar para mostrar ROUND tantos decimales como desee.

La colocación de la fecha en formato decimal como el antes mencionado ayuda con los cálculos de los grupos de edad, etc.

Esto es sólo un ejemplo artificial. En los escenarios del mundo real, que no sería convertir cadenas hasta la fecha utilizando TO_DATE.

Sin embargo, si usted tiene la fecha de nacimiento en formato de fecha, puede restar dos fechas con seguridad.

Supongamos que usted quiere tener la edad (número de años solamente, un número fijo) de alguien que nació en June 4, 1996, ejecute este comando:

SELECT TRUNC(TO_NUMBER(SYSDATE - TO_DATE('04-06-1996')) / 365.25) AS AGE FROM DUAL;

Resultado: (Ejecutado 28 de de mayo de, 2019)

       AGE
----------
        22

Explicación:

  • SYSDATE:. Get (OS) fecha real del sistema
  • TO_DATE('04-06-1996'): Convertir VARCHAR (cadena) fecha de nacimiento en DATE (tipo SQL)
  • .
  • TO_NUMBER(...): Convertir una fecha para NUMBER (tipo SQL)
  • Devide por 365.25: Para tener una bissextile años cada cuatro años (4 * 0,25 = 1 más días).
  • Trunc(...):. Recuperar toda la parte sólo de un número

Usted puede tratar a continuación método,

SELECT EXTRACT(YEAR FROM APP_SUBMITTED_DATE)-EXTRACT(YEAR FROM BIRTH_DATE) FROM SOME_TABLE;

Se comparará años de edad y dar en consecuencia.
También se puede utilizar en lugar de SYSDATE APP_SUBMITTED_DATE.

Saludos.

seleccionar (SYSDATE-DOB) / 365 "edad" de doble

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top