RSS-подписка

RSS-лента

Новые статьи

Последние комментарии


Получать обновления на эл. почту

Ваш e-mail:

Рассылка новостей от Loco

MySQL и PHP: Вычисление возраста (количество лет) по дате рождения

MySQL и PHP: Вычисление возраста (количество лет) по дате рождения MySQL и PHP: Вычисление возраста (количество лет) по дате рождения

Для биографий полезно автоматическое вычисление возраста по дате рождения (birthday), причём если личности уже нет в живых, то вводим дату смерти (deathday). Для живых она будет NULL или "0000-00-00". И возраст вычисляется используя сегодняшнюю дату

1. Более точный метод (на PHP). Создать отдельно функцию

public function getage($y, $m, $d) {
        if(($m > date('m')) || (($m == date('m')) && ($d > date('d'))))
            return (date('Y') - $y - 1);
        else
            return (date('Y') - $y);
    }

и в неё передавать год, месяц и день - LocoHelper::getage($y = substr($row["birthday"],0,4), $m=substr($row["birthday"],5,2), $d=substr($row["birthday"],8,2));

 

2. Та же суть для MySQL (источник - http://xandeadx.ru/blog/mysql/515)

SELECT
  birthday,
  (
    (YEAR(CURRENT_DATE) - YEAR(birthday)) -                             /* step 1 */
    (DATE_FORMAT(CURRENT_DATE, '%m%d') < DATE_FORMAT(birthday, '%m%d')) /* step 2 */
  ) AS age
FROM users

Первым шагом вычитаем из текущего года, год рождения, вторым шагом вычитаем единичку если дня рождения в этом году ещё не было.

birthday это поле с датой в любом валидном формате (не timestamp), например 1989-07-22 или даже 1989-07-22T00:00:00

 

3. Не очень совершенный метод (високосность с годами даёт добавку на лишний день за каждые 4 года):


$diff = abs(time()-strtotime($model->birthday)); 
$years = floor($diff / (365*60*60*24));
Если указана дата смерти, то 
$diff = abs(strtotime($model->deathday) - strtotime($model->birthday)); 
$years = floor($diff / (365*60*60*24));

Для MySQL используем функцию FLOOR() - она отсекает дробную часть от числа.

То есть при запросе будет

SELECT last_name, first_name, birth, death, FLOOR((TO_DAYS(death) - TO_DAYS(birth)) / 365) AS age
FROM biographies WHERE death
IS NOT NULL
ORDER BY age DESC LIMIT 5;

или так

(YEAR(death) - YEAR(birth) - IF(RIGHT(death,5)<RIGHT(birth,5)),1,0) AS age

 

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.