26

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

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

但是有一个问题:比如现在是五月,如果一个人战争出生于 1970 年 6 月,他还有 31 岁而不是 32,但表达式返回 32。
我无法摆脱这个问题,谁能帮帮我?

4

9 回答 9

93

对于遇到此问题的任何人:

另一种方法是:

SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student

对于月份的差异,替换YEARMONTH,对于天数,替换YEARDAY

希望有帮助!

于 2014-05-23T08:59:40.830 回答
17
select id, floor(datediff(curdate(),birth_date) / 365)
from student

将结果设置为整数怎么样?

于 2012-05-08T21:28:01.383 回答
4

尝试:

SELECT 
  DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birth_date)), '%Y')+0
  AS age FROM student;
于 2012-05-08T21:29:27.993 回答
4

接受的答案几乎是正确的,但可能导致错误的结果。

事实上,/ 365不考虑闰年,如果比较与生日具有相同日期和月份的日期,可能会导致错误的结果。

为了更准确,您必须将其除以 4 年的平均天数,即 (365 * 4) + 1(每 4 年闰年)=> 365.25

你会更准确:

select id, floor(datediff(curdate(),birth_date) / 365.25) from student

测试了我的一个项目并且它正在工作。

于 2012-12-21T07:53:09.357 回答
1

为什么不对第二种方法的输出使用 MySQL 的 FLOOR() 函数?任何分数都将被删除,从而为您提供所需的结果。

于 2012-05-08T21:28:04.250 回答
0

您可以使用它来获取整数值。

select id, CAST(datediff(curdate(),birth_date) / 365 as int)
from student

如果你想阅读CONVERT()这里CAST() 是链接。

于 2012-05-08T21:41:02.480 回答
0

我建议这样做:

DATE_FORMAT(NOW(),"%Y")
   -DATE_FORMAT(BirthDate,'%Y')
   -(
     IF(
      DATE_FORMAT(NOW(),"%m-%d") < DATE_FORMAT(BrthDate,'%m-%d'),
      1,
      0
     )
    ) as Age

这应该非常适合闰年;-)

于 2013-03-26T21:19:20.050 回答
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()小数点即可

于 2016-12-08T18:33:33.240 回答
0

我没有足够的声誉来对 Rat-a-tat-a-tat Ratatouille 的答案添加评论以改进他的代码。这是更好的 SQL 查询:

SELECT IFNULL(TIMESTAMPDIFF(YEAR, birthdate, CURDATE()), YEAR(CURDATE()) - YEAR(birthdate)) AS age

这更好,因为有时“生日”可能只包含出生年份,而日和月为 0。如果 TIMESTAMPDIFF() 返回 NULL,我们可以通过从出生年份减去当前年份来找到粗略的年龄。

于 2018-04-01T17:20:06.367 回答