我在 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 个月。我将不胜感激任何帮助。
我在 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 个月。我将不胜感激任何帮助。
当您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
并减去这些字段,调整当前日期是否早于当年的生日。
按照 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