Alter an Stichtag

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Der_Paul
*
Beiträge: 18
Registriert: Di, 31.03.2015 11:37

Alter an Stichtag

Beitrag von Der_Paul » Mo, 13.06.2016 18:15

Servus Leute,

könnt ihr mir die korrekte Syntax / passenden Befehl geben um in dieser Abfrage ein exakten Tag als Stichtag anstelle von CURDATE einzutragen?

SELECT "Vorname", "Name", "Geburtsdatum", DATEDIFF( 'yy', "Kontakte"."Geburtsdatum", CURDATE( ) ) "Alter" FROM "Kontakte"

Viele Grüße
Paul

RobertG
*******
Beiträge: 1727
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Alter an Stichtag

Beitrag von RobertG » Mo, 13.06.2016 21:21

Hallo Paul,

der Code, den Du da aufzeigst, gibt nur scheinbar das Alter einer Person wieder. Du berechnest die Differenz der Jahreszahlen zwischen am aktuellen Datum und dem Geburtsdatum. Für eine Person, die am 31.12.2015 geboren ist gibt der Code so ein Alter von 1 Jahr am 1.1.2016 aus. Wie so etwas genauer geht habe ich im Handbuch beschrieben: Kapitel "Datenbank-Aufgabe" > "Codeschnipsel" > "Aktuelles Alter ermitteln".

Statt CURDATE() kannst Du in Deinen Code auch für das ganze Jahr 2016 das Datum '2016-01-01' angeben. Ein Stichtag bringt da nichts, weil Du ja nur das Jahr über 'yy' abfragst.

Gruß

Robert

Der_Paul
*
Beiträge: 18
Registriert: Di, 31.03.2015 11:37

Re: Alter an Stichtag

Beitrag von Der_Paul » Mo, 13.06.2016 22:01

Hallo Robert,

habe die Abfrage kopiert und etwas angepasst.

SELECT "Vorname", "Name", "Geburtsdatum", CASEWHEN( DAYOFYEAR( "Kontakte"."Geburtsdatum" ) > DAYOFYEAR( CURDATE( ) ), DATEDIFF( 'yy', "Kontakte"."Geburtsdatum", CURDATE( ) ) - 1, DATEDIFF( 'yy', "Kontakte"."Geburtsdatum", CURDATE( ) ) ) "Jahre" FROM "Kontakte" ORDER BY "Name" ASC

Kann CURDATE durch ein genaues Datum ersetzt werden. Um z. B. das Alter am 01.07.2016 als Ergebnis zu bekommen? hm... wenn ich die Antwort von dir lese, muss ich dann auch etwas am 'yy' ändern?

=== EDIT ===
Wenn ich das richtig Verstehe, muss ich aus 'yy' 'd' für Tage machen und diese dann durch 365 teilen. Und das Ergebnis ohne Nachkommastelle anzeigen lassen.

=== EDIT 2 ===
Was hältst du von dieser Lösung? Auf den ersten Blick, zu später Uhrzeit, scheint sie zu machen was sie soll.
SELECT "Vorname", "Name", "Geburtsdatum", CASEWHEN( DAYOFYEAR( "Kontakte"."Geburtsdatum" ) > DAYOFYEAR( '2016-08-01' ), DATEDIFF( 'yy', "Kontakte"."Geburtsdatum", '2016-08-01' ) - 1, DATEDIFF( 'yy', "Kontakte"."Geburtsdatum", '2016-08-01' ) ) "Jahre" FROM "Kontakte" ORDER BY "Name" ASC

Viele Grüße
Paul

RobertG
*******
Beiträge: 1727
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Alter an Stichtag

Beitrag von RobertG » Di, 14.06.2016 07:55

Hallo Paul,

die letzte Abfrage deckt bis auf den 29.2. in Schaltjahren alles ab. Wenn Du den Stichtag wechseln willst, dann kannst Du das Datum '2016-08-01' natürlich auch irgendwo aus einer Filtertabelle auslesen oder über einen Parameter eingeben. Dann ist das universeller und muss nicht in jedem Jahr angepasst werden.

Gruß

Robert

Antworten