我正在计算数据库中一个人的年龄。
假设有这样一个简单的表:
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条答案
按热度按时间4ktjp1zp1#
对于任何人谁遇到这个:
另一种可以完成的方法是:
对于月份差异,请将
YEAR
替换为MONTH
,对于天数,请将YEAR
替换为DAY
ufj5ltwl2#
把结果取整数怎么样?
elcex8rz3#
试试看:
bxjv4tth4#
公认的答案几乎是正确的,但可能导致错误的结果。
事实上,
/ 365
没有考虑闰年,如果你比较的日期与生日的日期相同,可能会导致错误的结果。为了更准确,你必须将其除以4年的平均天数,也就是(365 * 4)+1(每4年的闰年)=〉365.25
而且你会更准确:
测试了我的一个项目,它的工作。
guicsvcw5#
为什么不在第二种方法的输出上使用MySQL的FLOOR()函数呢?任何分数都会被丢弃,从而得到您想要的结果。
lc8prwob6#
我没有足够的声誉给Rat-a-tat-a-tat Ratatouille的回答添加注解来改进他的代码。
这样做更好,因为有时“birthdate”可能只包含出生年份,而日和月为0。如果TIMESTAMPDIFF()返回NULL,我们可以通过从出生年份减去当前年份来找到大致年龄。
mw3dktmi7#
你可以用它来获取整数值。
如果你想了解
CONVERT()
和CAST()
here is the link.tvmytwxo8#
我的建议是:
这应该与闰年工作得很好;- )
tpxzln5u9#
这是可行的,即使考虑到闰年!
只需确保保留
floor()
,因为不需要小数