mysql: aus DATE Alter ermitteln?
sulu
- datenbank
0 King^Lully0 sulu0 King^Lully0 sulu0 King^Lully
0 Vinzenz Mai0 King^Lully0 sulu
0 Ilja0 Tobias Kloth
Hey ihrs
kann ich eigentlich auch unabhängig von irgendeinem Script mit SQL aus einer DATE Spalte ein Alter ermitteln?
Schaltjahre etc. werden ja vermutlich von mySQL unterstützt (korrigiert mich wenn ich falsch liege).
Hat jemand eine idee wie man sowas umsetzen könnte?
Hat jemand eine idee wie man sowas umsetzen könnte?
http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html
datediff (ist aber ein wenig heiss ;)
period_diff (schon besser)
eventuell auch to_days()
Mein Favorit zurzeit: period_diff
Hat jemand eine idee wie man sowas umsetzen könnte?
http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html
datediff (ist aber ein wenig heiss ;)
period_diff (schon besser)
eventuell auch to_days()Mein Favorit zurzeit: period_diff
Äh ich hab übrgens vergessen: Suche das Alter in JAHREN !
DATEDIFF liefert nur die Tage :(
Hat jemand eine idee wie man sowas umsetzen könnte?
http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html
datediff (ist aber ein wenig heiss ;)
period_diff (schon besser)
eventuell auch to_days()Mein Favorit zurzeit: period_diff
Äh ich hab übrgens vergessen: Suche das Alter in JAHREN !
DATEDIFF liefert nur die Tage :(
Mit period_diff() kriegst Du die Monate, was doch ausreicht:
1 Jahr = mdst. 12 Monate, wobei Du auch die Schaltjahresproblematik gelöst hast (sofern in MySQL richtig implementiert ;)
Habs jetzt so gemacht:
SELECT PERIOD(CURDATE(), geburtstag)/12) AS jahre
Jetzt bekomme ich aber sowas hier z.B.:
2502.67
2496.58
Die forderen zwei Ziffern sind das Alter, das ist schonmal ersichtlich.
Aber wie bekomme ich das da raus?
Habs jetzt so gemacht:
SELECT PERIOD(CURDATE(), geburtstag)/12) AS jahre
>
> Jetzt bekomme ich aber sowas hier z.B.:
> 2502.67
> 2496.58
Die von mir empfohlene Funktion ist leider ungeeignet, mir entging die schwer fassbare Parametriesierung der Funktion, Tagesangaben werden ignoriert. LOL
Kaum fassbar, aber ich finde auf die Schnelle keine bessere Lösung als den Mist, den Vinnie verlinkt hat.
Da hacke noch einer auf MS herum (die haben vernünftige Datums-/Zeitfunktionen), wenn MySQL so etwas bietet.
Eventuell geht was mit TIMEDIFF(expr,expr2), vgl. auch http://photomatt.net/2003/12/08/calculate-age-in-mysql/, alles nicht sehr vertrauenserweckend.
Vielleicht hier irgendwas:
http://www.google.de/search?hl=de&q=calculate+age+mysql&meta=
Hallo King,
Eventuell geht was mit TIMEDIFF(expr,expr2), vgl. auch http://photomatt.net/2003/12/08/calculate-age-in-mysql/, alles nicht sehr vertrauenserweckend.
doch, doch. Das von Dir verlinkte ist prinzipiell nichts anderes als der erste Benutzerkommentar. Photo Matts erster Kommentar, der hier von Tobias wiedergegeben wird, habe ich ja mit einem anderen Beispiel als Photo Matt selbst widerlegt. Solche Tagesrechnereien scheitern _immer_ an den Schaltjahren - es sei denn, man berücksichtigt die doch recht komplizierten Regeln.
Und das ist Blödsinn. Die Frage läuft stets darauf hinaus: Hatte die Person im aktuellen Jahr bereits Geburtstag
Wenn die Person im aktuellen Jahr bereits Geburtstag hatte
Alter = Differenz der beiden Jahresanteile
Sonst
Alter = Differenz der beiden Jahresanteile - 1
Ende Wenn
Das Problem ist damit reduziert auf die Feststellung: Ist der Geburtstag in diesem Jahr bereits erreicht.
Formatiert man den Monats- und Tagesanteil der beiden Datumsangaben in der Form
MMDD
so ist dies mit einem einfachen Vergleich erledigt. Dabei ist es unerheblich, ob der Monats- und Tagesanteil als Zeichenkette oder als Ganzzahl betrachtet wird.
Nichts anderes erfolgt im ersten Benutzerkommentar. Dieser verkompliziert die Sache nur dadurch, dass er noch berücksichtigt, dass date1 > date2 sein kann oder umgekehrt. Diesen Fall läßt Photo Matt außen vor.
Freundliche Grüße
Vinzenz
Eventuell geht was mit TIMEDIFF(expr,expr2), vgl. auch http://photomatt.net/2003/12/08/calculate-age-in-mysql/, alles nicht sehr vertrauenserweckend.
doch, doch. Das von Dir verlinkte ist prinzipiell nichts anderes als der erste Benutzerkommentar.
OK, halten wir fest, dass
SELECT
DATE_FORMAT(NOW(), '%Y') -
DATE_FORMAT(dob, '%Y') -
(DATE_FORMAT(NOW(), '00-%m-%d') > DATE_FORMAT(dob, '00-%m-%d'))
AS age
die einzig coole Lösung ist (sofern der letzte Vergleich, falls wahr, auch -1 liefert ;).
("Cool" in Anführungszeichen denken, meinen Ärger über die Datumsfunktionen von MySQL habe ich ja schon zu Ausdruck gebracht.)
Hallo
kann ich eigentlich auch unabhängig von irgendeinem Script mit SQL aus einer DATE Spalte ein Alter ermitteln?
Hat jemand eine idee wie man sowas umsetzen könnte?
Ja, das MySQL-Handbuch: http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
Schau' Dir den ersten Benutzerkommentar an ...
Freundliche Grüße
Vinzenz
Schau' Dir den ersten Benutzerkommentar an ...
IF((YEAR(date2) - YEAR(date1)) > 0, (YEAR(date2) - YEAR(date1)) - (MID(date2, 6, 5) < MID(date1, 6, 5)), IF((YEAR(date2) - YEAR(date1)) < 0, (YEAR(date2) - YEAR(date1)) + (MID(date1, 6, 5) < MID(date2, 6, 5)), (YEAR(date2) - YEAR(date1))))
ist ja wohl verglichen mit
SELECT
PERIOD_DIFF(date1,date2)/12 as Alter
etwas uncool.
finde das Beispiel mit PERIOD_DIFF auch besser.
Aber das Ergebnis ist vom PERIOD_DIFF-Beispiel ist 2502.68
yo,
Hat jemand eine idee wie man sowas umsetzen könnte?
der erste schritt die jahre des geburtsdatum mit dem heutigen jahr verrechnen.
select DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(datums_spalte, '%Y')
FROM tabelle
danach muss man nur noch darauf achten, ob die betroffenen person schon in dem jahr geburstag hatte oder nicht. wenn nicht, dann ein jahr abziehen.
select DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(datums_spalte, '%Y')-
IF(DATE_FORMAT(NOW(), '%c') < DATE_FORMAT(datums_spalte, '%c') OR
DATE_FORMAT(NOW(), '%c') = DATE_FORMAT(datums_spalte, '%c') AND
DATE_FORMAT(NOW(), '%e') <= DATE_FORMAT(datums_spalte, '%e'), 0, 1
)
FROM tabelle
Ilja
Hallo,
Hat jemand eine idee wie man sowas umsetzen könnte?
Ja: http://www.to-kl.de/scripte/mysql-schnipsel.html (die ersten zwei Punkte)
Grüße aus Nürnberg
Tobias
Hat jemand eine idee wie man sowas umsetzen könnte?
Ja: http://www.to-kl.de/scripte/mysql-schnipsel.html (die ersten zwei Punkte)
YEAR(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(geburtsdatum)+1))
Bist Du sicher, dass das immer richtig resultiert?
Hallo Tobias,
Hat jemand eine idee wie man sowas umsetzen könnte?
Ja: http://www.to-kl.de/scripte/mysql-schnipsel.html (die ersten zwei Punkte)
sorry, aber die erste Formel ist leider falsch :-(
Beweis:
SELECT YEAR(FROM_DAYS(TO_DAYS('2003-02-27') - TO_DAYS('2000-02-28') + 1))
-> 3
Nein, versuche bitte nicht, irgendwie noch 1 zu subtrahieren oder sonst etwas zu machen. Dieser Codeschnipsel berücksichtigt nicht die exakte Lage des Schalttages.
Zum von mir angeführten Beispiel in den Benutzerkommentaren möchte ich nur den
Kommentar abgeben, dass ich persönlich MONTH() und DAY() als verständlicher
gegenüber MID() bevorzuge.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
sorry, aber die erste Formel ist leider falsch :-(
Beweis:
SELECT YEAR(FROM_DAYS(TO_DAYS('2003-02-27') - TO_DAYS('2000-02-28') + 1))
-> 3
Stimmt, in dem speziellen Fall stimmt das Ergebnis nicht - allerdings ist dieser Fall sehr selten, die Methode mit dem TO_DAYS liefert bei allen über 700 Mitgliedern in meiner Datenbank das richtige Ergebnis. Prinzipiell ist es aber imho zu verschmerzen, wenn die Funktion in seltenen Fällen um einen Tag daneben liegt.
Zum von mir angeführten Beispiel in den Benutzerkommentaren möchte ich nur den
Kommentar abgeben, dass ich persönlich MONTH() und DAY() als verständlicher
gegenüber MID() bevorzuge.
Das Beispiel in den Benutzerkommentaren ist auch nicht perfekt - es liefert heute gleich 15 Fehler (alle die zwischen dem 25.5. und dem 31.5. Geburtstag haben) da es nicht berücksichtigt, ob jemand im aktuellen Monat schon Geburtstag hatte oder nicht. Ich habe den Query aus dem Benutzerkommentaren mal um die Berücksichtigung des Tages ergänzt (und das IF-Zeugs weggelassen):
SELECT ((YEAR('2003-02-27') - YEAR('2000-02-28')) - (MONTH('2003-02-27') < MONTH('2000-02-28')) -
(DAYOFMONTH('2003-02-27') < DAYOFMONTH('2000-02-28') AND MONTH('2003-02-27') = MONTH('2000-02-28')))
-> 2
(DAY() ist nur ein Synonym für DAYOFMONTH() und existiert erst ab MySQL 4.1, deswegen habe ich letzteres verwendet)
Grüße aus Nürnberg
Tobias
Stimmt, in dem speziellen Fall stimmt das Ergebnis nicht - allerdings ist dieser Fall sehr selten,
So ist es mit Dosom und Mogorrha auch angefangen.
die Methode mit dem TO_DAYS liefert bei allen über 700 Mitgliedern in meiner Datenbank das richtige Ergebnis. Prinzipiell ist es aber imho zu verschmerzen, wenn die Funktion in seltenen Fällen um einen Tag daneben liegt.
Wenn der Nutzer Fehlertoleranz hinzu gebaut hat und nicht das System. ;)