Frequently asked questions - Base

    From The Document Foundation Wiki
    < Faq‎ | Base
    This page is a translated version of the page Faq/Base/121 and the translation is 82% complete.
    Outdated translations are marked like this.


    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)