cálculo de Oracle Edad de la fecha de nacimiento y de hoy
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?
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')
: ConvertirVARCHAR
(cadena) fecha de nacimiento enDATE
(tipo SQL) .
-
TO_NUMBER(...)
: Convertir una fecha paraNUMBER
(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