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. Что и как? (22.07.2014)
- 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.11.2017)
- Артефакты при ресайзе библиотекой GD изображений с однородным (белым) фоном (07.12.2017)
- Задаем область печати документа для PHPExcel (05.12.2017)
- Как включить SSL и сделать редирект на HTTPS. На примере Opencart 2 (03.12.2017)
- Смена кодировки Битрикса с windows-1251 в UTF-8 (utf8) (01.12.2017)
- Свой дизайн кнопок социальных сетей для сайта. Кнопки "Поделиться" (19.06.2017)
- Ошибка: Invalid argument supplied for foreach() in ... (09.04.2017)
- MySQL: Как выбрать из таблицы строки, удовлетворяющие одновременно двум значениям колонки? (06.04.2017)
- MySQL ошибка: Unknown column 'table_name.id' in 'on clause' (06.04.2017)
- MySQL запрос приджойнивания с INNER JOIN 2-х таблиц к основной (18.11.2016)
- Загрузка файлов (картинок) по ajax через форму для Opencart (04.09.2016)
- Модальное окно Bootstrap 3 с формой, отправляющей email по Ajax (JQuery/PHP/HTML5/JqBootstrapValidation) (20.08.2015)
- VQmod — да или нет? (29.08.2014)