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