Pontos életkor kiszámítása date típusú mezőből

Közösségi szolgáltatásoknál általában minden felhasználónak van egy kis személyes felülete is, vagy ha más nem, egy profillapja. Egy ilyenen szerettem volna megjeleníteni a user születési dátuma alapján az életkorát, amikor egy kisebb akadályba ütköztem. Szerencsére lett megoldás.

Az egyik probléma, hogy habár a MySQL date típusú mezője a kellően idős felhasználókkal is megbírkózik, PHP-ben mégis elég bajos az 1970. január 1. előtti dátumokkal számolni (lásd unix timestamp formátum, meg az erre épülő date() függvény.) A másik nehézség, hogy hogyan tudnánk úgy megkapni az életkort, hogy az minden esetben napra pontosan stimmeljen (már betöltötte vs. még csak ezután fogja).

Nos, ezekre némi wikizés után SQL-ben lett meg a válasz, mégpedig valahogy így:

SELECT floor(DATEDIFF(now(), birthdate)/365.2425) FROM table;

(a “ma” és a “születésnap” különbségeként megkapjuk, hogy “hány napja él”, ezt elosztjuk az átlag évhosszúsággal)

A lényeg itt a 365.2425-ben van, a Gergely-naptár szerint ugyanis pontosan ennyi egy átlagos év hossza, figyelembe véve a szökőéveket és minden egyebet. Ezzel számolva tehát elhanyagolható hibaszázalékkal fogjuk megkapni a user pontos életkorát, szemben a Google-ben általam eddig fellelt megoldásokkal.

Születési idő: 1997. május 27. => Életkor: 10 éves
Születési idő: 1997. május 29. => Életkor: 9 éves
Születési idő: 1907. május 27. => Életkor: 100 éves
Születési idő: 1907. május 29. => Életkor: 99 éves
(Ma 2007. május 28. van.)

Ezt továbbgondolva, akár kiírhatnánk azt is nagy pontossággal, hogy hány éppen éves és hány hónapos:

SELECT
concat(floor(DATEDIFF(now(),birthdate)/365.2425),' éves ',
if (floor((DATEDIFF(now(),birthdate)-floor(DATEDIFF(now(),birthdate)/365.2425)*365.2425)/31)=0,'',concat('és ',floor((DATEDIFF(now(),birthdate)-floor(DATEDIFF(now(),birthdate)/365.2425)*365.2425)/31),' hónapos')), ' vagy'
);

1 hozzászólás

  1. inf3rno, 2007. június 5., 12:49

    http://en.wikipedia.org/wiki/Julian_day ezzel elvileg lehet pontosan napokat számolni

     

Új hozzászólás: