Возраст и день рождения через SELECT

Иногда хочется быстро вычислить сколько дней до дня рождения пользователя. Вы все видели это в Одноклассниках и ЖЖ. Это можно делать в запросе например таким образом для mysql 5

SELECT
TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) years_old,
TIMESTAMPDIFF(DAY, NOW(), DATE_ADD(users.birth_date, INTERVAL 1+TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) YEAR)) next_birth_days
FROM users

Нашёл в своём стареньком коде, может кому полезно будет..

Коллега Юра скинул версию для старенькой mysql 4, может это даже лучше: SELECT
IF(
    DATE_ADD(birth_date, INTERVAL (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) YEAR) > NOW(),
    (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) -1,
    (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y'))
   ) as years_old,
DATEDIFF(
DATE_ADD (birth_date, INTERVAL IF(
DATE_ADD(birth_date, INTERVAL (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) YEAR) > NOW(),
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) ,
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) + 1
) YEAR ),NOW()) as next_birth_days
FROM users

 

RSS

Комментарии

  • Ага... полезно будет. Мне всё же беспокоит то, что через 29 лет "кончится" юникс-эпоха, так как переполнится чисовой тип данных.... А что тогда?
  • А тогда я надеюсь mysql переведёт дату на bigint и ещё пару триллионов лет я смогу жить спокойно
  • Роман
    avatar
    Артем, а как данный запрос влияет на производительность выборки?
  • Обескураживающе влияет. Ничего нагрузочного я тут не вижу, бенчмарки проводить не буду - не такая большая база и работа с int помоему вполне простая.
  • alek
    avatar
    FLOOR(((TO_DAYS(NOW()) - TO_DAYS(birthday))/365.25))
    выдает ближайшее целое значение возраста