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

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 Composer – пакетный менеджер PHP. Что и как? (13.01.2022)
- 0 MySQL и PHP: Вычисление возраста (количество лет) по дате рождения (20.06.2017) ← вы тут
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Как изменить часовой пояс на сервере (16.11.2013)
- 0 PHP: Как удалить файлы по маске? (07.11.2013)
- 0 Регулярные выражения в PHP (12.04.2014)
- 0 MySQL: выбираем данные за период времени (за текущий месяц, за эту неделю..) (30.10.2013)
- 0 Защита от спама в phpBB3 без капчи (09.10.2013)
- 0 Php функция implode внутри запроса SELECT к MySQL. (02.09.2013)
- 0 Как убрать папку www из денвера? (22.03.2013)
- 0 Устанавливаем и настраиваем WampServer (аналог MAMP в Mac и возможная замена Denwer'у) на Windows (22.03.2013)
- 0 Полезные возможности PhpStorm и настройка горячих клавиш (14.03.2013)
- 0 Полезные команды для вебразработчика (20.09.2021)
- Оборачиваем изображения в ссылки с помощью хука add_filter('the_content', ...) в functions.php (14.08.2019)
- Добавляем форму отправки обратного звонка на сайт (по Javascript и с ReCaptcha) (29.07.2019)
- Преимущества ИТ–аутсорсинга (25.03.2019)
- Отладка PHP кода в консоли браузера (22.03.2019)
- Ошибка в phpmyadmin: count(): Parameter must be an array or an object that implements Countable (27.03.2019)
- Две или более reCaptcha на одной странице. Несколько рекапч на странице (25.02.2019)
- Оверлей кнопка на видео HTML5 video overlay play button (15.02.2019)
- Удаление из таблицы записей, если значения поля нет в другой таблице (28.10.2018)
- Битрикс: Формирование цены - отделить пробелом тысячи от сотен (04.02.2018)
- Настраиваем красивое меню типа гамбургер на мобильных, используя плагин mmenu. На примере 1С-Битрикс (04.02.2018)
- Артефакты при ресайзе библиотекой GD изображений с однородным (белым) фоном (07.12.2017)
- Задаем область печати документа для PHPExcel (05.12.2017)
