Frequently asked questions - Base
TDF LibreOffice Document Liberation Project Community Blogs Weblate Nextcloud Redmine Ask LibreOffice Spende
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",
(HSQLDB, GUI)
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"
oder
SELECT "Geburtsdatum",
(Firebird, GUI)
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"
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",
(HSQLDB, GUI)
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"
oder
SELECT "Geburtsdatum",
(Firebird, GUI)
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"