Oracle Calcul de l'âge de la date de naissance et aujourd'hui
Question
Je veux calculer l'âge actuel de la date de naissance dans ma fonction Oracle.
Ce que je me sers est (Today-Dob)/30/12
, mais ce n'est pas exact que quelques mois ont 31 jours.
Je dois obtenir l'âge correct avec la précision maximale. Comment puis je faire ça?
La solution
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>
Autres conseils
Pour la logique métier, je trouve généralement un nombre décimal (en années) est utile:
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;
Ceci est facile et directement au point.
Et une alternative sans utiliser l'arithmétique et de chiffres (bien qu'il n'y ait rien de mal avec de cela):
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.
Ou que diriez-vous?
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;
Cela semble beaucoup plus facile que ce que quelqu'un d'autre a suggéré
select sysdate-to_date('30-jul-1977') from dual;
L'âge (années complètes) de la personne:
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
Vous pouvez essayer
SELECT ROUND((SYSDATE - TO_DATE('12-MAY-16'))/365.25, 5) AS AGE from DUAL;
Vous pouvez configurer ROUND
pour afficher autant de décimales que vous le souhaitez.
Placer la date au format décimal comme mentionné ci-dessus aide aux calculs des groupes d'âge, etc.
Ceci est juste un exemple artificiel. Dans de véritables scénarios du monde, vous ne seriez pas en train de convertir des chaînes à ce jour en utilisant TO_DATE
.
Toutefois, si vous avez la date de naissance au format de date, vous pouvez soustraire deux dates en toute sécurité.
Supposons que vous voulez avoir l'âge (nombre d'années seulement, un nombre fixe) de quelqu'un qui est né sur June 4, 1996
, exécutez la commande suivante:
SELECT TRUNC(TO_NUMBER(SYSDATE - TO_DATE('04-06-1996')) / 365.25) AS AGE FROM DUAL;
Résultat: (Exécuté 28 mai 2019)
AGE
----------
22
Explication:
-
SYSDATE
:. Obtenez du système (OS) date réelle -
TO_DATE('04-06-1996')
: ConvertVARCHAR
(string) en date de naissanceDATE
(type SQL) .
-
TO_NUMBER(...)
: convertir une date àNUMBER
(type SQL) - Devide par
365.25
: Pour avoir un année bissextile tous les quatre ans (4 * 0,25 = 1 jour de plus). -
Trunc(...)
:. Récupérer toute la partie que d'un certain nombre
Vous pouvez ci-dessous méthode,
SELECT EXTRACT(YEAR FROM APP_SUBMITTED_DATE)-EXTRACT(YEAR FROM BIRTH_DATE) FROM SOME_TABLE;
Il comparera ans et donner âge en conséquence.
Vous pouvez également utiliser SYSDATE
au lieu de APP_SUBMITTED_DATE
.
Cordialement.
sélectionner (SYSDATE-DOB) / 365 "âge" de la double