Подтвердить что ты не робот

Вычислить возраст в MySQL (InnoDb)

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

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

4b9b3361

Ответ 1

Если значение хранится как тип данных 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 

Ответ 3

select *,year(curdate())-year(dob) - (right(curdate(),5) < right(dob,5)) as age from your_table

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

Ответ 5

select floor(datediff (now(), birthday)/365) as age

Ответ 6

Просто:

DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(`birthDate`)), '%Y')+0 AS age

Ответ 7

Попробуйте следующее:

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);

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

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

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

Ответ 8

Вот как вычислить возраст в MySQL:

select
  date_format(now(), '%Y') - date_format(date_of_birth, '%Y') - 
  (date_format(now(), '00-%m-%d') < date_format(date_of_birth, '00-%m-%d'))
as age from table

Ответ 9

Вы можете сделать функцию:

drop function if exists getIdade;

delimiter |

create function getIdade( data_nascimento datetime )
returns int
begin
    declare idade int;
    declare ano_atual int;
    declare mes_atual int;
    declare dia_atual int;
    declare ano int;
    declare mes int;
    declare dia int;

    set ano_atual = year(curdate());
    set mes_atual = month( curdate());
    set dia_atual = day( curdate());

    set ano = year( data_nascimento );
    set mes = month( data_nascimento );
    set dia = day( data_nascimento );

    set idade = ano_atual - ano;

    if( mes > mes_atual ) then
            set idade = idade - 1;
    end if;

    if( mes = mes_atual and dia > dia_atual ) then
            set idade = idade - 1;
    end if;

    return idade;
end|

delimiter ;

Теперь вы можете получить возраст от даты:

select getIdade('1983-09-16');

Если дата дана в формате Y-m-d H: i: s, вы можете сделать это:

select getIdade(substring_index('1983-09-16 23:43:01', ' ', 1));

Вы можете повторно использовать эту функцию где угодно;)

Ответ 10

Я предпочитаю использовать функцию таким образом.

DELIMITER $$ DROP FUNCTION IF EXISTS `db`.`F_AGE` $$
    CREATE FUNCTION `F_AGE`(in_dob datetime) RETURNS int(11)
        NO SQL
    BEGIN
       DECLARE l_age INT;
       IF DATE_FORMAT(NOW(  ),'00-%m-%d') >= DATE_FORMAT(in_dob,'00-%m-%d') THEN
          -- This person has had a birthday this year
          SET l_age=DATE_FORMAT(NOW(  ),'%Y')-DATE_FORMAT(in_dob,'%Y');
        ELSE
          -- Yet to have a birthday this year
          SET l_age=DATE_FORMAT(NOW(  ),'%Y')-DATE_FORMAT(in_dob,'%Y')-1;
       END IF;
       RETURN(l_age);
    END $$

    DELIMITER ;

теперь использовать

SELECT F_AGE('1979-02-11') AS AGE; 

ИЛИ

SELECT F_AGE(date) AS age FROM table;

Ответ 11

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

select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age 
from table 
where ...

Ответ 12

Просто сделайте

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

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

Ответ 13

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

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"))