Oracle Alte Berechnung von Geburtsdatum und Heute
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?
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')
: ConvertVARCHAR
(string) birth inDATE
(SQL-Typ) .
-
TO_NUMBER(...)
: Konvertieren Sie ein Datum zuNUMBER
(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