2

我在 mysql 中有 1988-04-04 格式的日期字段。我需要以 25/04 月格式计算年龄。我试过这个:

SELECT CONCAT(
    FLOOR((curdate() - dob) / 31536000),
    'y ',
    FLOOR(MOD((curdate() - dob) / 31536000 * 12, 12)),
    'm'
) `age` from age

它给了我 0/0 个月。我将不胜感激任何帮助。

4

2 回答 2

1

当您curdate()在数字上下文中选择时,您将获得yyyymmdd值,例如20130812(对于今天,2013 年 8 月 12 日)。这对于日期计算并不是那么有用。

例如,我的生日(我是老屁)将是19650202。当您计算出与今天之间的数字差异时,您会得到480610.

现在,如果你把除以31536000(不确定你是从哪里得到的),你肯定会得到零,尽管我是一个 48 岁的老头 :-)

您最好使用datediff()计算两个日期之间的天数差异,然后应用正确的除法和模运算从中获得全年和几个月,例如(未经测试,但应该是一个好的开始):

select
    floor (100 * datediff (curdate(), dob) / 36525) as years,
    floor (mod (100 * datediff (curdate(), dob), 36525) / 100 / 30) as months
from age

这不会是完美的,因为闰年​​的位置会对其产生一点影响,每年的实际天数是长期365.2425的,我们假设30每月准确的天数,但它应该在几天内准确.

如果您想要更准确的度量,您需要找到或实施一些更精确的方程式来计算这些值。

这可能需要使用year()month()从当前日期中提取相关字段dob并减去这些字段,调整当前日期是否早于当年的生日。

于 2013-08-12T07:45:03.937 回答
0

按照 paxdiablo 的建议使用 DATEDIFF:

SELECT
  FLOOR(DATEDIFF(CURDATE(), dob) / 365.25) AS years,
  FLOOR(MOD(DATEDIFF(CURDATE(), dob), 365.25) / (365.25 / 12)) AS months
FROM age
于 2013-08-12T07:56:44.767 回答