如果我的出生日期以表格的形式存储在表格中,dd-mm-yyyy
并且从当前日期中减去该日期,那么返回的日期格式是什么?
如何使用这种返回的格式来计算某人的年龄?
如果我的出生日期以表格的形式存储在表格中,dd-mm-yyyy
并且从当前日期中减去该日期,那么返回的日期格式是什么?
如何使用这种返回的格式来计算某人的年龄?
Answers:
如果该值存储为DATETIME数据类型:
SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(dob) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(dob, 5)) as age
FROM YOUR_TABLE
考虑leap年时不太精确:
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
这样,您甚至可以考虑出生的月份和日期,以便更准确地计算年龄。
year(curdate())-year(dob) - (dayofyear(curdate()) < dayofyear(dob)) as age
,我觉得dayofyear更优雅。
select floor(datediff (now(), birthday)/365) as age
只是:
DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(`birthDate`)), '%Y')+0 AS age
尝试这个:
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');
如果日期格式为Ymd 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;
dd-mm-yyyy
?如果它是date
数据类型,则可能会以数字格式存储(例如,作为从某个起始点起带天数的整数)