Рассчитать возраст в MySQL (InnoDb) - PullRequest
58 голосов
/ 25 апреля 2011

Если в таблице в форме dd-mm-yyyy хранится дата рождения человека, и я вычитаю ее из текущей даты, в каком формате возвращается дата?

Как я могу использовать этот возвращенный формат для подсчета чьего-либо возраста?

Ответы [ 13 ]

210 голосов
/ 22 октября 2013

Вы можете использовать функцию TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2):

SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age

Демо

54 голосов
/ 25 апреля 2011

Если значение хранится как тип данных DATETIME:

SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(dob) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(dob, 5)) as age 
  FROM YOUR_TABLE

Менее точно, если учитывать високосные годы:

SELECT DATEDIFF(CURRENT_DATE, STR_TO_DATE(t.birthday, '%d-%m-%Y'))/365 AS ageInYears
  FROM YOUR_TABLE t 
10 голосов
/ 25 апреля 2011
select *,year(curdate())-year(dob) - (right(curdate(),5) < right(dob,5)) as age from your_table

таким образом, вы учитываете даже месяц и день рождения, чтобы иметь более точный расчет возраста.

7 голосов
/ 22 июня 2016
SELECT TIMESTAMPDIFF (YEAR, YOUR_COLUMN, CURDATE()) FROM YOUR_TABLE AS AGE

Нажмите для демонстрации ..

Простой, но элегантный ..

4 голосов
/ 25 апреля 2011
select floor(datediff (now(), birthday)/365) as age
2 голосов
/ 15 февраля 2013

Просто:

DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(`birthDate`)), '%Y')+0 AS age
1 голос
/ 20 марта 2013

Поскольку вопрос помечен для mysql, у меня есть следующая реализация, которая работает для меня, и я надеюсь, что аналогичные альтернативы были бы для других СУБД.Вот sql:

select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age 
from table 
where ...
1 голос
/ 25 апреля 2011

Попробуйте:

SET @birthday = CAST('1980-05-01' AS DATE);
SET @today = CURRENT_DATE();

SELECT YEAR(@today) - YEAR(@birthday) - 
  (CASE WHEN
    MONTH(@birthday) > MONTH(@today) OR 
    (MONTH(@birthday) = MONTH(@today) AND DAY(@birthday) > DAY(@today)) 
      THEN 1 
      ELSE 0 
  END);

Возвращает этот год - год рождения (сколько лет человеку будет в этом году после дня рождения) и корректируется в зависимости от того, был ли у человека день рождения еще в этом году.

Это не страдает от ошибок округления других методов, представленных здесь.

Свободно адаптировано из здесь

0 голосов
/ 23 августа 2017

Существует два простых способа сделать это:

1

select("users.birthdate",
            DB::raw("FLOOR(DATEDIFF(CURRENT_DATE, STR_TO_DATE(users.birthdate, '%Y-%m-%d'))/365) AS age_way_one"),

2-

select("users.birthdate",DB::raw("(YEAR(CURDATE())-YEAR(users.birthdate)) AS age_way_two"))
0 голосов
/ 14 июля 2017

Просто выполните

SELECT birthdate, (YEAR(CURDATE())-YEAR(birthdate)) AS age FROM `member` 

имя дня рождения - это имя поля, в котором имя даты рождения сохраняется, и CURDATE () превращается в год по команде YEAR () минус YEAR () из поля даты рождения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...