如何存储Birthdate和Age,以便每天可以在PHP / MySQL中更新Age?

时间:2012-03-20 14:16:27

标签: php mysql date date-of-birth

我应该如何在MySQL中存储Birthdate,以便我可以通过Cron作业轻松地每天更新每个人的年龄?

存储Age和Birthdate是否有意义,以便在涉及Age的搜索时,我不必动态计算每个Age并浪费CPU资源?

如果是这样,我应该如何1)存储出生日期,2)每天计算年龄?

我可以想象每日cron脚本首先过滤掉其出生日期不是当月的用户,然后过滤掉其出生日不是当天的用户,然后将每个用户的年龄增加1。左

这有意义吗?如果是这样,我该怎么做?有没有更好的方法来做所有这些?

5 个答案:

答案 0 :(得分:13)

简单的答案是不要;从不存储人的年龄。每年每个人都会发生变化,但正如您所说,您必须每天检查每个人是否正确。

仅存储出生日期,然后从数据库中选择时计算年龄。它只有today - date of birth所以几乎不需要任何CPU。

编辑:

为了扩展我在ManseUK's answer中的评论,还有失败的可能性。如果您的服务器/数据库关闭会发生什么?或者您的更新无法在指定时间运行?或者有人出现并在该日期运行更新后手动运行它?或者有人关闭你的日程安排?如果您在从数据库中选择时计算Age,则没有发生这种情况的危险。

要选择年龄介于25至30岁之间并假设日期列dateofbirth,您的查询将类似于:

select *
  from users
 where dateofbirth between date_add( curdate(), interval -30 year )
                       and date_add( curdate(), interval -25 year )

确保users上的dateofbirth已编入索引。

答案 1 :(得分:3)

不,不要存储年龄,只需在查询中计算。至于生日,我更喜欢将所有日期/时间都放在unix时间戳中(因为我讨厌在日期格式更改的语言环境设置中处理可移植性)

答案 2 :(得分:2)

  

存储年龄

是否有意义

没有

  

我不需要动态计算每个Age并浪费CPU资源吗?

事实上,你的日常更新方法浪费了更多的“CPU资源”(你的想法太模糊了)。

  

有没有更好的方法来完成所有这些?

存储生日,并在选定时间计算年龄

  

如果您想查找年龄大于25但小于30的所有人,该怎么办?

这是非常简单的查询,如此

WHERE birth_date BETWEEN date_sub(curdate(), INTERVAL 25 YEAR) 
                     AND date_sub(curdate(), INTERVAL 30 YEAR)

查询将使用索引(如果有的话),因此速度快,没​​有任何[不必要的]非规范化

答案 3 :(得分:0)

我将在这里反对大多数所有答案。

我会存储两个......

  • 更新年龄快速而简单 - 单个mysql查询可以每天运行并完成
  • 如果您有大量的网页浏览量,则计算年龄非常耗时 - 查看的次数远远超过更改次数

想象一下一个表格场景 - 一个包含100或1000行的表格,显示一个人的年龄......计算需要多长时间?

我一直认为Stackoverflow动态计算了声誉,但你可以在Stackoverflow data explorer上看到他们没有 - 看到右边架构中的User对象。它每次更改时都会记录和更新 - 我猜这纯粹是因为它的观察次数远远超过了变化次数

答案 4 :(得分:0)

我不认为计算时代动态占用大量内存是完全正确的。 为什么不为一年中的每一天创建一个365行1行的表CALENDAR。并存储与其生日相对应的日期的用户ID列表。 对于每一天,只需参考当天的表格条目并刷新所选用户的年龄。 即使用户群增加,这也会大大降低复杂性。