[gelöst] Altersberechnung aus Geburtstag falsch

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

[gelöst] Altersberechnung aus Geburtstag falsch

Beitrag von Yaddayadda »

Hallo,

ich lasse mir mit einer Abfrage aus dem in einer Tabelle gespeicherten Geburtsdatum das Alter berechnen. Dazu benutze ich die Formel

Code: Alles auswählen

CASEWHEN( DAYOFYEAR( [Geburtsdatum] ) > DAYOFYEAR( CURDATE( ) ), DATEDIFF( 'year', [Geburtsdatum], CURDATE( ) ) - 1, DATEDIFF( 'year', [Geburtsdatum], CURDATE( ) ) )
Leider liefert die Abfrage falsche Ergebnisse, wenn der Geburtstag auf den aktuellen Tag folgt. Also Geburtstag 25.6.2010, aktuelles Datum 24.6.2012, sprich das Kind wird am nächsten Tag 2 Jahre alt, ist aber noch 1 Jahr alt. Die obige Abfrage liefert mir jedoch den Wert "2".

Das gleiche passiert übrigens, wenn ich mit der Formel

Code: Alles auswählen

( DATEDIFF( 'dd', "Geburtstag", CURDATE( ) ) ) / 365,25
rechne.

Was muss ich tun, um eine korrekte Berechnung zu erhalten?

Vielen Dank,
yaddayadda
Zuletzt geändert von Yaddayadda am Di, 26.06.2012 08:53, insgesamt 1-mal geändert.
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Altersberechnung aus Geburtstag falsch

Beitrag von RobertG »

Der Fehler liegt im Schaltjahr begründet.
Schau einmal im LO-Base-Handbuch nach. Da habe ich das genauer beschrieben:
http://wiki.documentfoundation.org/imag ... en_V35.pdf

Gruß

Robert
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Altersberechnung aus Geburtstag falsch

Beitrag von Yaddayadda »

RobertG hat geschrieben:Der Fehler liegt im Schaltjahr begründet.
Schau einmal im LO-Base-Handbuch nach. Da habe ich das genauer beschrieben:
http://wiki.documentfoundation.org/imag ... en_V35.pdf

Gruß

Robert
Danke, so ist die Berechnung endlich korrekt. :-)
Allerdings habe ich nun das Problem, dass die Alters-Mittelwerte (bezogen auf die Gruppenzugehörigkeit) nicht mehr richtig berechnet werden. Das hat vorher geklappt, aber nun erhalte ich nur ganze, gerundete(?) Zahlen statt Zahlen mit 1 Nachkommastelle. Also z.B. 5 statt richtigerweise 5,5 oder 3 statt 2,8.
Wo muss ich das Format entsprechend einstellen, dass die Mittelwerte wieder richtig berechnet werden?

Nochmals danke,
Gruß, yaddayadda
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Altersberechnung aus Geburtstag falsch

Beitrag von RobertG »

Yaddayadda hat geschrieben: Allerdings habe ich nun das Problem, dass die Alters-Mittelwerte (bezogen auf die Gruppenzugehörigkeit) nicht mehr richtig berechnet werden. Das hat vorher geklappt, aber nun erhalte ich nur ganze, gerundete(?) Zahlen statt Zahlen mit 1 Nachkommastelle. Also z.B. 5 statt richtigerweise 5,5 oder 3 statt 2,8.
Wo muss ich das Format entsprechend einstellen, dass die Mittelwerte wieder richtig berechnet werden?
Die Berechnung wird vermutlich weiterhin korrekt sein. Hast Du einmal das Zahlenformat eingestellt? (Nachkommastellen).
Wie berechnest Du die Mittelwerte?

Gruß

Robert
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Altersberechnung aus Geburtstag falsch

Beitrag von Yaddayadda »

RobertG hat geschrieben:
Yaddayadda hat geschrieben: Allerdings habe ich nun das Problem, dass die Alters-Mittelwerte (bezogen auf die Gruppenzugehörigkeit) nicht mehr richtig berechnet werden. Das hat vorher geklappt, aber nun erhalte ich nur ganze, gerundete(?) Zahlen statt Zahlen mit 1 Nachkommastelle. Also z.B. 5 statt richtigerweise 5,5 oder 3 statt 2,8.
Wo muss ich das Format entsprechend einstellen, dass die Mittelwerte wieder richtig berechnet werden?
Die Berechnung wird vermutlich weiterhin korrekt sein. Hast Du einmal das Zahlenformat eingestellt? (Nachkommastellen).
Wie berechnest Du die Mittelwerte?
Ich lasse die Mittelwerte mit folgender Abfrage berechnen:

Code: Alles auswählen

SELECT AVG( "Alter" ) AS "Durchschnitt", "Gruppe", COUNT( "Nachname" ) AS "Alter / Gruppe" FROM "Altersberechnung" GROUP BY "Gruppe" ORDER BY "Gruppe" ASC
Wie gesagt, bis zu der Änderung der Formel für die Altersberechnung hat alles geklappt. Nun ist zwar das Alter endlich korrekt, aber die Mittelwerte nicht mehr. *seufz*

Wo stelle ich denn die Nachkommastellen ein? Habe es über "Spaltenformat" probiert, aber alles was ich dort einstelle ist beim nächsten Ausführen der Abfrage wieder vergessen.

Gruß,
yaddayadda
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Altersberechnung aus Geburtstag falsch

Beitrag von F3K Total »

Hallo,
versuch es mal mit

Code: Alles auswählen

SELECT AVG(convert ("Alter", DOUBLE)) AS "Durchschnitt", "Gruppe", COUNT( "Nachname" ) AS "Alter / Gruppe" FROM "Altersberechnung" GROUP BY "Gruppe" ORDER BY "Gruppe" ASC
oder

Code: Alles auswählen

SELECT AVG(cast ("Alter" as DOUBLE)) AS "Durchschnitt", "Gruppe", COUNT( "Nachname" ) AS "Alter / Gruppe" FROM "Altersberechnung" GROUP BY "Gruppe" ORDER BY "Gruppe" ASC
Gruß R
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Altersberechnung aus Geburtstag falsch

Beitrag von Yaddayadda »

F3K Total hat geschrieben:Hallo,
versuch es mal mit

Code: Alles auswählen

SELECT AVG(convert ("Alter", DOUBLE)) AS "Durchschnitt", "Gruppe", COUNT( "Nachname" ) AS "Alter / Gruppe" FROM "Altersberechnung" GROUP BY "Gruppe" ORDER BY "Gruppe" ASC
Gruß R
Damit klappt es wieder. Vielen Dank. Kannst du mir vielleicht noch erklären, was dieses (convert ("Alter", DOUBLE)) bewirkt?

Gruß, yaddayadda
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Altersberechnung aus Geburtstag falsch

Beitrag von F3K Total »

... nun, es konvertiert die Zahl "Alter" in eine double precision Zahl.
Ob es da auch noch andere mögliche Zahlentypen gibt, kann ich nicht sagen, habe es selbst durch try and error herausgefunden.
Gruß R
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Altersberechnung aus Geburtstag falsch

Beitrag von RobertG »

Die Datentypen findest Du im Base-Handbuch - Anhang. DOUBLE ist ein Zahlentyp, der nicht unbedingt exakt ist - macht sich bei Deinen Berechnungen aber nicht bemerkbar, da die Begrenzung bei 15 Nachkommastellen und 8 Byte Speicherbedarf festgelegt ist.

Gruß

Robert
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Altersberechnung aus Geburtstag falsch

Beitrag von Yaddayadda »

F3K Total hat geschrieben:... nun, es konvertiert die Zahl "Alter" in eine double precision Zahl.
Ob es da auch noch andere mögliche Zahlentypen gibt, kann ich nicht sagen, habe es selbst durch try and error herausgefunden.
Gruß R
Aha. Da wär ich als Anfänger natürlich nie drauf gekommen, dass es damit dann wieder funktioniert. Insofern nochmal vielen Dank!

Habe aber noch zwei andere Fragen, vielleicht kannst du mir da ja auch helfen.

Wieso kann ich bei der Altersberechnung kein Kriterium angeben? Sobald ich eine Abfrage erstelle und im Feld "Alter" ein Kriterium angebe, z.B. > 4 weil ich alle Kinder aufgelistet haben will, die älter als 4 Jahre sind, bekomme ich nur immer einen Syntax-Error in SQL-Expression.

Das zweite Problem ist, dass ich falsche Alterswerte und mehrfach doppelte Ergebnisse erhalte, sobald ich in einer Abfrage das Feld "Alter" hinzufüge. Ich möchte z.B. alle Kinder auflisten, die älter als 4 Jahre sind und nicht in der Vorschulgruppe sind. Dazu nehme ich diese Abfrage:

Code: Alles auswählen

SELECT "Stammdaten"."Nachname", "Stammdaten"."Vorname", "Stammdaten"."Gruppe", "Stammdaten"."Vorschulkind", "Altersberechnung"."Alter" FROM "Altersberechnung", "Stammdaten" WHERE "Stammdaten"."Vorschulkind" = FALSE
Vorschulkind ist dabei ein Ja/Nein (Boolean)-Feld. Das Alterskriterium kann ich wie gesagt gar nicht angeben ohne dass es zu einem Fehler kommt. Doch selbst ohne Altersbeschränkung klappt es nicht. Meine Datenbank enthält derzeit 12 Datensätze, doch ich erhalte bei der obigen Abfrage 41 Einträge mit Mehrfachnennungen und total falschen Alterswerten. Was läuft hier falsch?

Gruß,
yaddayadda
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Altersberechnung aus Geburtstag falsch

Beitrag von RobertG »

Wie greifst Du auf die Altersberechnung zu? Ich würde die gesamte Berechnung des Alters sicherheitshalber als Ansicht abspeichern und damit dann weiter arbeiten.

Gruß

Robert
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Altersberechnung aus Geburtstag falsch

Beitrag von F3K Total »

Hi,
kann nicht klappen, du greifst auf zwei Tabellen zu, ohne das es eine Beziehung zwischen den beiden gibt:

Code: Alles auswählen

... from "Altersberechnung", "Stammdaten" ...
Also werden alle möglichen Kombinationen erzeugt.
Wenn Du einen Primärschlüssel, z.B. "ID", hast, den du in die View "Alterberechnung" übernimmst, geht es z.B. so:

Code: Alles auswählen

SELECT "Stammdaten"."Nachname", "Stammdaten"."Vorname", "Stammdaten"."Gruppe", "Stammdaten"."Vorschulkind", "Altersberechnung"."Alter" FROM "Altersberechnung", "Stammdaten" WHERE "Stammdaten"."ID" = "Altersberechnung"."ID" and "Altersberechnung"."Alter" > 4
Oder du schaffst eine eindeutige Zuordnung über "Nachname" und "Vorname", die dann aber in der View "Altersberechnung" vorkommen müssen ...

Code: Alles auswählen

SELECT "Stammdaten"."Nachname", "Stammdaten"."Vorname", "Stammdaten"."Gruppe", "Stammdaten"."Vorschulkind", "Altersberechnung"."Alter" FROM "Altersberechnung", "Stammdaten" WHERE "Stammdaten"."Nachname" = "Altersberechnung"."Nachname" and "Stammdaten"."Vorname" = "Altersberechnung"."Vorname" and "Altersberechnung"."Alter" > 4
oder, oder , oder ...

Einfache wäre es, wenn Du die DB, ggf. verfremdet, hier mal hochladen würdest.
Gruß R
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Altersberechnung aus Geburtstag falsch

Beitrag von Yaddayadda »

F3K Total hat geschrieben:Hi,
kann nicht klappen, du greifst auf zwei Tabellen zu, ohne das es eine Beziehung zwischen den beiden gibt:

Code: Alles auswählen

... from "Altersberechnung", "Stammdaten" ...
Also werden alle möglichen Kombinationen erzeugt.
Wenn Du einen Primärschlüssel, z.B. "ID", hast, den du in die View "Alterberechnung" übernimmst, geht es z.B. so:

Code: Alles auswählen

SELECT "Stammdaten"."Nachname", "Stammdaten"."Vorname", "Stammdaten"."Gruppe", "Stammdaten"."Vorschulkind", "Altersberechnung"."Alter" FROM "Altersberechnung", "Stammdaten" WHERE "Stammdaten"."ID" = "Altersberechnung"."ID" and "Altersberechnung"."Alter" > 4
Gruß R
Und wieder hast du mein Problem gelöst, tausend Dank! :D
Antworten