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

Ram*_*uri 20 mysql

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

student(id, birth_date);
Run Code Online (Sandbox Code Playgroud)

其中id是主键(实际上表格更复杂但我简化了它).
我想知道一个人多大年纪:

select id, datediff(curdate(),birth_date) 
from student
Run Code Online (Sandbox Code Playgroud)

但是它会在几天内返回结果,而不是几年.我可以将它除以365:

select id, datediff(curdate(),birth_date) / 365
from student
Run Code Online (Sandbox Code Playgroud)

但它返回一个浮点值,我想要一个整数.
所以我可以计算年数:

select id, year(curdate())-year(birth_date) 
from student
Run Code Online (Sandbox Code Playgroud)

但是有一个问题:比如现在是5月,如果一个人在1970年6月出生的战争他还有31年而不是32岁,但表达式返回32.
我不能摆脱这个问题,有人可以帮我吗?

Rat*_*lle 70

对于遇到此问题的人:

另一种方法是:

SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student
Run Code Online (Sandbox Code Playgroud)

在几个月的差异,更换YEARMONTH,日子替换YEARDAY

希望有所帮助!

  • 同上coolscitist - 这看起来是最简单,最优雅的答案. (3认同)

Sco*_*ner 16

select id, floor(datediff(curdate(),birth_date) / 365)
from student
Run Code Online (Sandbox Code Playgroud)

将结果放在一个整数怎么样?

  • 这不需要考虑闰年.漂移可能变得很重要.`select floor(datediff("2017-03-19","1975-03-30")/ 365);`说42.这个人是41天,11天休息. (8认同)
  • 同意@Schwern (2认同)

Cyr*_* N. 5

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

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

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

而且你会更准确:

select id, floor(datediff(curdate(),birth_date) / 365.25) from student
Run Code Online (Sandbox Code Playgroud)

对我的一个项目进行了测试,它正在工作。