将MySQL中两个日期之间的年份差异作为整数

时间:2012-05-08 21:23:34

标签: mysql

我试图计算一个人在数据库中的年龄 我们假设有这个简单的表格:

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。 我不能摆脱这个问题,有人可以帮助我吗?

9 个答案:

答案 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,我们可以通过从出生年份减去当前年份来查找粗略年龄。