13 ответов:
Если значение хранится в виде типа данных 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
можно использовать
TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)функция:SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age
select *,year(curdate())-year(dob) - (right(curdate(),5) < right(dob,5)) as age from your_tableтаким образом, вы рассматриваете даже месяц и день рождения, чтобы иметь более точный расчет возраста.
попробуйте это:
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);он возвращает этот год-Год рождения (сколько лет человеку будет в этом году после дня рождения) и настраивается на основе того, был ли у человека день рождения еще в этом году.
Он не страдает от ошибок округления других представленных здесь методов.
свободно адаптировано из здесь
Это как вычислить возраст в 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
вы можете сделать функцию, чтобы сделать это:
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));вы можете использовать эту функцию в любом месте ;)
Я предпочитаю использовать функцию таким образом.
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;
Так как вопрос помечается для
mysql, У меня есть следующая реализация, которая работает для меня, и я надеюсь, что подобные альтернативы будут там для других СУБД. вот sql:select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age from table where ...
просто
SELECT birthdate, (YEAR(CURDATE())-YEAR(birthdate)) AS age FROM `member`дата рождения-это имя поля, которое сохраняет имя даты рождения возьмите творог () поверните к команде год за годом () минус с годом() от поля даты рождения
есть два простых способа сделать это:
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"))
Comments