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?

Était-ce utile?

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'): Convert VARCHAR (string) en date de naissance DATE (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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top