获取MySQL中两个日期之间的年差(整数)

bpsygsoo  于 2022-12-26  发布在  Mysql
关注(0)|答案(9)|浏览(140)

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

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岁。
我解决不了这个问题,有人能帮帮我吗?

4ktjp1zp

4ktjp1zp1#

对于任何人谁遇到这个:
另一种可以完成的方法是:

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

对于月份差异,请将YEAR替换为MONTH,对于天数,请将YEAR替换为DAY

ufj5ltwl

ufj5ltwl2#

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

把结果取整数怎么样?

elcex8rz

elcex8rz3#

试试看:

SELECT 
  DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birth_date)), '%Y')+0
  AS age FROM student;
bxjv4tth

bxjv4tth4#

公认的答案几乎是正确的,但可能导致错误的结果。
事实上,/ 365没有考虑闰年,如果你比较的日期与生日的日期相同,可能会导致错误的结果。
为了更准确,你必须将其除以4年的平均天数,也就是(365 * 4)+1(每4年的闰年)=〉365.25
而且你会更准确:

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

测试了我的一个项目,它的工作。

guicsvcw

guicsvcw5#

为什么不在第二种方法的输出上使用MySQL的FLOOR()函数呢?任何分数都会被丢弃,从而得到您想要的结果。

lc8prwob

lc8prwob6#

我没有足够的声誉给Rat-a-tat-a-tat Ratatouille的回答添加注解来改进他的代码。

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

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

mw3dktmi

mw3dktmi7#

你可以用它来获取整数值。

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

如果你想了解CONVERT()CAST()here is the link.

tvmytwxo

tvmytwxo8#

我的建议是:

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

这应该与闰年工作得很好;- )

tpxzln5u

tpxzln5u9#

这是可行的,即使考虑到闰年!

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(),因为不需要小数

相关问题