Frage

Ich möchte das aktuelle Alter von Geburtsdatum in meiner Oracle-Funktion berechnen.

Was ich verwende ist (Today-Dob)/30/12, aber dies ist nicht genau, wie einige Monate 31 Tage haben.

Ich brauche das korrekte Alter mit der maximalen Präzision zu erhalten. Wie kann ich das machen?

War es hilfreich?

Lösung

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>

Andere Tipps

Für Business-Logik ich in der Regel eine Dezimalzahl finden (in Jahren) ist nützlich:

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;

Dies ist einfach und direkt auf den Punkt.

Und eine Alternative ohne jede Arithmetik und Zahlen (obwohl es nichts falsch mit dem ist):

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.

Oder wie wäre das?

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;

Dies scheint wesentlich einfacher als das, was jemand anderes vorgeschlagen hat

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

Alter (volle Jahre) der Person:

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

Sie können versuchen,

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

Sie können ROUND konfigurieren, wie viele Dezimalstellen zeigen, wie Sie wollen.

Platzieren Sie das Datum im Dezimalformat wie oben erwähnten hilft bei der Berechnung der Altersgruppen, etc.

Dies ist nur ein konstruiertes Beispiel. In realen Szenarien, würden Sie nicht Strings bisher mit TO_DATE werden zu konvertieren.

Wenn Sie jedoch Geburtsdatum Datumsformat haben, können Sie zwei Daten sicher subtrahieren.

Nehmen wir an, dass Sie das Alter (Anzahl der Jahre nur eine feste Anzahl) haben wollen, von jemandem auf June 4, 1996 geboren, führen Sie diesen Befehl:

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

Ergebnis: (Ausgeführt 28. Mai 2019)

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

Erklärung:

  • SYSDATE. Get-System (OS) aktuelles Datum
  • TO_DATE('04-06-1996'): Convert VARCHAR (string) birth in DATE (SQL-Typ)
  • .
  • TO_NUMBER(...): Konvertieren Sie ein Datum zu NUMBER (SQL-Typ)
  • Devide pro 365.25: Um ein bissextile Jahr alle vier Jahre (4 * 0,25 = 1 mehr Tag).
  • Trunc(...):. Rufen Sie den gesamten Teil nur aus einer Reihe

Sie können unter Methode versuchen,

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

Es wird Jahre vergleichen und gibt Alter entsprechend.
Sie können auch SYSDATE statt APP_SUBMITTED_DATE verwenden.

Viele Grüße.

wählen (SYSDATE-DOB) / 365 "Alter" von Dual

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top