Discussion:
Altersberechnungen im OO - Base
Jürgen
2010-12-21 18:50:45 UTC
Permalink
Hallo,

gibt es eigentlich auch eine Möglichkeit, in Base, z.B. mit einer
Abfrage eine Altersberechnung durchzuführen?
Das Geburtsdatum ist ja in vielen Tabellen vorhanden, fehlt mir zum
Rechnen nur eine Möglichkeit - analog zu Calc - das jeweils aktuelle
Datum zu nutzen. "JETZT" oder "HEUTE" scheint Base aber in der Abfrage
nicht zu kennen....

Jürgen
Robert Großkopf
2010-12-21 20:02:38 UTC
Permalink
Hallo Jürgen,
Post by Jürgen
gibt es eigentlich auch eine Möglichkeit, in Base, z.B. mit einer
Abfrage eine Altersberechnung durchzuführen?
Das Geburtsdatum ist ja in vielen Tabellen vorhanden, fehlt mir zum
Rechnen nur eine Möglichkeit - analog zu Calc - das jeweils aktuelle
Datum zu nutzen. "JETZT" oder "HEUTE" scheint Base aber in der Abfrage
nicht zu kennen....
Ist wegen der Umschreibungen zum Jahr etwas kompliziert. Die
zugrundeliegende HSQLDB beschreibt das hier:
http://hsqldb.org/doc/guide/ch09.html

Da das Alter aufgrund des Jahres ermittelt wird muss die Differenz
zwischen dem Jahr jetzt und dem Jahr des angegebenen Datums erfolgen.
Allerdings werden damit alle Personen, die in dem aktuellen jahr noch
keinen Geburtstag hatten, ein Jahr älter angegeben. Die folgende
Funktion fragt deshalb erst einmal, ob der Tag im Jahr vom "GebDat"
(mein Geburtsdatumsfeld) größer ist als der Tag im Jahr von dem
momentanen Datum. Unter den Umständen wird einfach von dem ermittelten
Alter ein Jahr abgezogen. Ansonsten wird das Alter einfach durch die
Jahresdifferenz angegeben.

CASEWHEN( DAYOFYEAR( "GebDat" ) > DAYOFYEAR( NOW( ) ), DATEDIFF( 'yy',
"GebDat", NOW( ) ) - 1, DATEDIFF( 'yy', "GebDat", NOW( ) ) ) AS "Alter"

Gruß

Robert
Jürgen
2010-12-22 13:40:22 UTC
Permalink
Hallo Robert,

Deine Ausführungen sind ein hilfreicher zweiter Schritt.... Meine aktuelle Hürde
besteht aber noch darin, daß ich zwar Abfragen mit Berechnungen erstellen kann,
indem ich in "Feld" eine Formel eintrage (z.B. "Anzahl" * "Stückpreis", um einen
Endbetrag zu berechnen), mit meinem definierten Feld "GebDat" habe ich aber nur
den einen Wert und weiter keine Ahnung, wie ich das aktuelle Datum für diese
Abfrage definieren kann.
CURRENT_DATE oder CURDATE (beide mit und ohne eckige Klammern)haben mir in der
Abfrage auch nicht geholfen. Irgendeinen "Platzhalter" muß es doch für
Berechnungen mit dem aktuellen Datum auch (besser: ganz besonders) in Abfragen
geben. Leider konnte ich bislang nichts finden....

Jürgen

---------------
Post by Robert Großkopf
Hallo Jürgen,
Post by Jürgen
gibt es eigentlich auch eine Möglichkeit, in Base, z.B. mit einer
Abfrage eine Altersberechnung durchzuführen?
Das Geburtsdatum ist ja in vielen Tabellen vorhanden, fehlt mir zum
Rechnen nur eine Möglichkeit - analog zu Calc - das jeweils aktuelle
Datum zu nutzen. "JETZT" oder "HEUTE" scheint Base aber in der Abfrage
nicht zu kennen....
Ist wegen der Umschreibungen zum Jahr etwas kompliziert. Die
http://hsqldb.org/doc/guide/ch09.html
Da das Alter aufgrund des Jahres ermittelt wird muss die Differenz
zwischen dem Jahr jetzt und dem Jahr des angegebenen Datums erfolgen.
Allerdings werden damit alle Personen, die in dem aktuellen jahr noch
keinen Geburtstag hatten, ein Jahr älter angegeben. Die folgende
Funktion fragt deshalb erst einmal, ob der Tag im Jahr vom "GebDat"
(mein Geburtsdatumsfeld) größer ist als der Tag im Jahr von dem
momentanen Datum. Unter den Umständen wird einfach von dem ermittelten
Alter ein Jahr abgezogen. Ansonsten wird das Alter einfach durch die
Jahresdifferenz angegeben.
CASEWHEN( DAYOFYEAR( "GebDat" )> DAYOFYEAR( NOW( ) ), DATEDIFF( 'yy',
"GebDat", NOW( ) ) - 1, DATEDIFF( 'yy', "GebDat", NOW( ) ) ) AS "Alter"
Gruß
Robert
Robert Großkopf
2010-12-22 17:34:23 UTC
Permalink
Hallo Jürgen,
Post by Jürgen
CURRENT_DATE oder CURDATE (beide mit und ohne eckige Klammern)haben mir
in der Abfrage auch nicht geholfen. Irgendeinen "Platzhalter" muß es
doch für Berechnungen mit dem aktuellen Datum auch (besser: ganz
besonders) in Abfragen geben. Leider konnte ich bislang nichts finden....
Grundlage 1:
Wenn Du so ins Detail gehst, dass Du Funktionen aus der hsqldb nutzt,
dann schalte den grafischen Editor aus und schreibe die entsprechende
Funktion als Text an die entsprechenden Stellen.

Grundlage 2: Manche Funktionalitäten bietet OpenOffice bei der Datenbank
nicht an, solange die grafische Oberfläche dazwischengeschaltet ist. Da
ist es dann notwendig, die Befehle per direktem SQL zu geben. Dafür gibt
es einen zusätzlichen Button. Hiervon ist allerdings die
Geburtsdatumsberechnung nicht berührt.

Ich kopiere im Folgenden einfach einmal eine Abfrage aus einer meiner
Datenbanken ein:

SELECT "gruID", "Nachname", "Vorname", "AufDat", CASEWHEN( DAYOFYEAR(
"GebDat" ) > DAYOFYEAR( NOW( ) ), DATEDIFF( 'yy', "GebDat", NOW( ) ) -
1, DATEDIFF( 'yy', "GebDat", NOW( ) ) ) AS "Alter", DATEDIFF( 'yy',
"GebDat", NOW( ) ) AS "Alter_aktuelles_Jahr" FROM
"Mitglied_aktuell_Ansicht" ORDER BY "gruID" ASC, "Alter" DESC

Diese Ansicht erhalte ich, wenn ich die Abfrage mit rechtem Mausklick
unter SQL-Ansicht bearbeiten öffne.
Die Tabelle heißt "Mitglied_aktuell_Ansicht". Der Auswahlbefehl gibt 6
Spalten aus: gruID, Nachname usw. In der letzten Spalte wird das Alter
abgebildet, das sich auf das aktuelle Jahr bezieht. Im Sport werden z.B.
danach die Wettkampfklassen eingeteilt. Diese Altersermittlung ist die
der einfachen Struktur.
Wenn diese Abfrage hast Du die halbe Miete. DATEDIFF usw. kannst Du
natürlich auch in der grafischen Benutzeroberfläche eingeben - nur ist
die Enge des Feldes dafür nicht besonders hilfreich. 'yy' gibt an, dass
die Jahreseingabe des Datums zählt, GebDat ist das Feld, auf das sich
alles bezieht und NOW() ist das jetzige Datum. Die oben genannten
eckigen Klammern verstehe ich nicht. CURDATE() steht in der Anleitung.
CURRENT_DATE müsste ohne Klammern zu nutzen sein.

Gruß

Robert
Jürgen
2010-12-23 17:18:00 UTC
Permalink
Vielen Dank Robert, so hat's geklappt.

Jürgen
Post by Robert Großkopf
Hallo Jürgen,
Post by Jürgen
CURRENT_DATE oder CURDATE (beide mit und ohne eckige Klammern)haben mir
in der Abfrage auch nicht geholfen. Irgendeinen "Platzhalter" muß es
doch für Berechnungen mit dem aktuellen Datum auch (besser: ganz
besonders) in Abfragen geben. Leider konnte ich bislang nichts finden....
Wenn Du so ins Detail gehst, dass Du Funktionen aus der hsqldb nutzt,
dann schalte den grafischen Editor aus und schreibe die entsprechende
Funktion als Text an die entsprechenden Stellen.
Grundlage 2: Manche Funktionalitäten bietet OpenOffice bei der Datenbank
nicht an, solange die grafische Oberfläche dazwischengeschaltet ist. Da
ist es dann notwendig, die Befehle per direktem SQL zu geben. Dafür gibt
es einen zusätzlichen Button. Hiervon ist allerdings die
Geburtsdatumsberechnung nicht berührt.
Ich kopiere im Folgenden einfach einmal eine Abfrage aus einer meiner
SELECT "gruID", "Nachname", "Vorname", "AufDat", CASEWHEN( DAYOFYEAR(
"GebDat" )> DAYOFYEAR( NOW( ) ), DATEDIFF( 'yy', "GebDat", NOW( ) ) -
1, DATEDIFF( 'yy', "GebDat", NOW( ) ) ) AS "Alter", DATEDIFF( 'yy',
"GebDat", NOW( ) ) AS "Alter_aktuelles_Jahr" FROM
"Mitglied_aktuell_Ansicht" ORDER BY "gruID" ASC, "Alter" DESC
Diese Ansicht erhalte ich, wenn ich die Abfrage mit rechtem Mausklick
unter SQL-Ansicht bearbeiten öffne.
Die Tabelle heißt "Mitglied_aktuell_Ansicht". Der Auswahlbefehl gibt 6
Spalten aus: gruID, Nachname usw. In der letzten Spalte wird das Alter
abgebildet, das sich auf das aktuelle Jahr bezieht. Im Sport werden z.B.
danach die Wettkampfklassen eingeteilt. Diese Altersermittlung ist die
der einfachen Struktur.
Wenn diese Abfrage hast Du die halbe Miete. DATEDIFF usw. kannst Du
natürlich auch in der grafischen Benutzeroberfläche eingeben - nur ist
die Enge des Feldes dafür nicht besonders hilfreich. 'yy' gibt an, dass
die Jahreseingabe des Datums zählt, GebDat ist das Feld, auf das sich
alles bezieht und NOW() ist das jetzige Datum. Die oben genannten
eckigen Klammern verstehe ich nicht. CURDATE() steht in der Anleitung.
CURRENT_DATE müsste ohne Klammern zu nutzen sein.
Gruß
Robert
Loading...