我试图计算一个人在数据库中的年龄 我们假设有这个简单的表格:
student(id, birth_date);
其中id是主键(确实表格更复杂,但我简化了它) 我想知道一个人多大年纪:
select id, datediff(curdate(),birth_date)
from student
但是它会在几天内返回结果,而不是几年。我可以将它除以365:
select id, datediff(curdate(),birth_date) / 365
from student
但是它返回一个浮点值,我想要一个整数 所以我可以计算年份:
select id, year(curdate())-year(birth_date)
from student
但是有一个问题:比如现在是5月,如果一个人在1970年6月出生的战争他还有31年而不是32岁,但表达式返回32。 我不能摆脱这个问题,有人可以帮助我吗?
答案 0 :(得分:59)
对于遇到此问题的任何人:
另一种方法是:
SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student
对于月份差异,请将YEAR
替换为MONTH
,并将YEAR
替换为DAY
希望有所帮助!
答案 1 :(得分:17)
select id, floor(datediff(curdate(),birth_date) / 365)
from student
将结果整理为整数怎么样?
答案 2 :(得分:4)
尝试:
SELECT
DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birth_date)), '%Y')+0
AS age FROM student;
答案 3 :(得分:4)
接受的答案几乎是正确的,但可能导致错误的结果。
事实上,/ 365
没有考虑到闰年,如果你比较出生日期与当天和月相同的日期,可能导致假结果。
为了更准确,您必须将其除以4年的平均天数,即(365 * 4)+ 1(每4年的闰年)=> 365.25
你会更准确:
select id, floor(datediff(curdate(),birth_date) / 365.25) from student
测试了我的一个项目并且它正在运行。
答案 4 :(得分:1)
为什么不在第二种方法的输出上使用MySQL的FLOOR()函数?任何分数都将被删除,为您提供所需的结果。
答案 5 :(得分:0)
您可以使用它来获取整数值。
select id, CAST(datediff(curdate(),birth_date) / 365 as int)
from student
如果您想了解CONVERT()
和CAST()
here is the link.
答案 6 :(得分:0)
我建议:
DATE_FORMAT(NOW(),"%Y")
-DATE_FORMAT(BirthDate,'%Y')
-(
IF(
DATE_FORMAT(NOW(),"%m-%d") < DATE_FORMAT(BrthDate,'%m-%d'),
1,
0
)
) as Age
这应该适用于闰年; - )
答案 7 :(得分:0)
这很有效,即使考虑到了闰年!
select floor((cast(date_format('2016-02-29','%Y%m%d') as int) - cast(date_format('1966-03-01','%Y%m%d') as int)/10000);
请务必保留floor()
,因为不需要小数
答案 8 :(得分:0)
我没有足够的声誉来为Rat-a-tat-a-tat Ratatouille的答案添加评论来改进他的代码。这是更好的SQL查询:
SELECT IFNULL(TIMESTAMPDIFF(YEAR, birthdate, CURDATE()), YEAR(CURDATE()) - YEAR(birthdate)) AS age
这更好,因为有时“生日”可能只包含出生年份,而日期和月份为0.如果TIMESTAMPDIFF()返回NULL,我们可以通过从出生年份减去当前年份来查找粗略年龄。