Alter über Geburtsdatum bestimmen - FAQ-Base

From The Document Foundation Wiki
< Faq‎ | Base‎ | 121
Jump to: navigation, search

Wie kann ich das Alter anhand eines Geburtsdatums bestimmen?

Das Alter einer Person schein erst einmal recht einfach zu ermitteln zu sein:

SELECT "Geburtsdatum", DATEDIFF('yy',"Geburtsdatum",CURRENT_DATE) AS "Alter" FROM "Person" (HSQLDB, GUI)

oder

SELECT "Geburtsdatum", DATEDIFF(year,"Geburtsdatum",CURRENT_DATE) AS "Alter" FROM "Person" (Firebird, GUI)

Startet diese Abfrage aber z.B. am 1.2.2017, so kann sie die folgenden Ergebnisse haben:

Geburtsdatum Alter
30.12.2015 2
01.01.2015 2

Das erste Alter ist offensichtlich falsch, da der Tag der Abfrage im Jahr vor dem Tag liegt, an dem die Person Geburtstag hat. Es muss also nachgebessert werden:

SELECT "Geburtsdatum",
CASE
WHEN( DAYOFYEAR("Geburtsdatum") > DAYOFYEAR(CURRENT_DATE))
THEN DATEDIFF('yy',"Geburtsdatum",CURRENT_DATE)-1
ELSE DATEDIFF('yy',"Geburtsdatum",CURRENT_DATE)
END
AS "Alter"
FROM "Person"
(HSQLDB, GUI)

oder

SELECT "Geburtsdatum",
CASE
WHEN( EXTRACT(YEARDAY FROM "StartDate") > EXTRACT(YEARDAY FROM CURRENT_DATE))
THEN DATEDIFF(year,"StartDate",CURRENT_DATE)-1
ELSE DATEDIFF(year,"StartDate",CURRENT_DATE)
END AS "Alter"
FROM "Person"
(Firebird, GUI)

Mit diesen Abfragen kommt am 1.2.2017 folgendes Ergebnis:

Geburtsdatum Alter
30.12.2015 1
01.01.2015 2

Diese Abfragen funktionieren vom Prinzip her ganz gut. Es kann allerdings zu Fehlern mit Schaltjahren kommen, wenn die Geburtstage am 29.02. oder am 1.03. liegen. Mit dieser Bedingung wird die Abfrage noch deutlich umfangreicher. Es muss nach dem Monat und nach dem Tag im Monat gefragt werden. Wer am 29.02. geboren wurde hat danach in normalen Jahren am 1.03. Geburtstag:

SELECT "Geburtsdatum",
CASE
WHEN( MONTH("Geburtsdatum") > MONTH(CURRENT_DATE) OR (MONTH("Geburtsdatum") = MONTH(CURRENT_DATE) AND DAY("Geburtsdatum") > DAY(CURRENT_DATE)))
THEN DATEDIFF('yy',"Geburtsdatum",CURRENT_DATE)-1
ELSE DATEDIFF('yy',"Geburtsdatum",CURRENT_DATE)
END AS "Alter"
FROM "Person"
(HSQLDB, GUI)

oder

SELECT "Geburtsdatum",
CASE
WHEN( EXTRACT(MONTH FROM "Geburtsdatum") > EXTRACT(MONTH FROM CURRENT_DATE) OR ( EXTRACT(MONTH FROM "Geburtsdatum") = EXTRACT(MONTH FROM CURRENT_DATE) AND EXTRACT(DAY FROM "Geburtsdatum") > EXTRACT(DAY FROM CURRENT_DATE)))
THEN DATEDIFF(year,"StartDate",CURRENT_DATE)-1
ELSE DATEDIFF(year,"StartDate",CURRENT_DATE)
END AS "Alter"
FROM "Person"
(Firebird, GUI)