-1

我有一个名为“用户”的 MYSQL 表。在此表中,每个用户都有一行。在每一行中,我都有一个名为“created”的列,其中包含创建帐户时的时间戳,这是模板“0000-00-00 00:00:00”。我还有一个专栏叫“年龄”。我想要的是,当用户登录时,可以显示他/她的年龄。处理这种情况的最佳方法是什么,以便可以将用户年龄(以天为单位)放置在列中并显示?

4

4 回答 4

1

要检索以天为单位的“年龄”(即当前日期时间的午夜和存储在列中的日期时间(或时间戳)值的午夜之间的整数天数之差created

SELECT DATEDIFF(NOW(),u.created) AS age_in_days
     , ...
  FROM users u
 WHERE ...

要使用相同的计算填充age列:

UPDATE users u
   SET u.age = DATEDIFF(NOW(),u.created)
 WHERE ... 

如果您想通过包含时间分量来稍微不同地计算“年龄”,

SELECT TIMESTAMPDIFF(DAY,u.created,NOW()) AS age_in_days 

请注意,结果略有不同,它在计算天数时考虑了时间分量。考虑:

SELECT TIMESTAMPDIFF(DAY,'2013-02-02 18:59','2013-02-03 14:00') AS age0
     , DATEDIFF('2013-02-03 14:00','2013-02-02 18:59') AS age1

假设您想保留此值,将“年龄”值存储在列中似乎有点多余。任何有谓词的查询age,例如

WHERE u.age > 100

可以同样有效地针对created列编写:

WHERE u.created > NOW() + INTERVAL -100 DAY

但这确实会返回稍微不同的结果,因为它考虑了时间分量。仅对日期部分进行比较,效率会降低:

WHERE DATE(u.created) > CURDATE() + INTERVAL -100 DAY

于 2013-02-03T00:29:41.150 回答
0

Assuming that your creation date really is a timestamp, and that it's called creationdate:

SELECT YEAR(NOW()) - YEAR(creationdate) - (DATE_FORMAT(NOW(), '%m%d') < DATE_FORMAT(creationdate, '%m%d')) AS age FROM whatever

This runs inside MySQL so you can return it as part of the SELECT where you obtain the user's information.

于 2013-02-03T00:09:52.707 回答
0

Try using DateTime for this:

$now      = new DateTime();
$birthday = new DateTime('1973-04-18 09:48:00');
$interval = $now->diff($birthday);
echo $interval->format('%a days'); 

See it in action

于 2013-02-03T00:10:24.540 回答
0

您可以使用 strtotime() 函数将 TIMESTAMP 转换为 unix 时间,使用 time() 获取当前 unix 时间,从当前时间中减去生日时间并将其转换为年。

于 2013-02-03T00:15:05.647 回答