我有一个名为“users”的MYSQL表。在此表中,每个用户都有一行。在每一行中,我都有一个名为“created”的列,其中包含创建帐户的时间戳,这是模板“0000-00-00 00:00:00”。我还有一个名为“年龄”的专栏。我想要的是当用户登录时,可以显示他/她的年龄。处理这种情况的最佳方法是什么,以便用户年龄(以天为单位)可以放在列中并显示?
答案 0 :(得分: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”值存储在列中似乎有点多余。任何有age
谓词的查询,例如
WHERE u.age > 100
可以与created
列一样有效地编写:
WHERE u.created > NOW() + INTERVAL -100 DAY
但这确实会返回略有不同的结果,因为它需要考虑时间成分。要仅对日期部分进行比较,效率会降低:
WHERE DATE(u.created) > CURDATE() + INTERVAL -100 DAY
答案 1 :(得分:0)
假设您的创建日期确实是一个时间戳,并且它被称为creationdate
:
SELECT YEAR(NOW()) - YEAR(creationdate) - (DATE_FORMAT(NOW(), '%m%d') < DATE_FORMAT(creationdate, '%m%d')) AS age FROM whatever
这在MySQL内部运行,因此您可以将其作为SELECT的一部分返回,以获取用户的信息。
答案 2 :(得分:0)
尝试使用DateTime:
$now = new DateTime();
$birthday = new DateTime('1973-04-18 09:48:00');
$interval = $now->diff($birthday);
echo $interval->format('%a days');
答案 3 :(得分:0)
您可以使用strtotime()函数将TIMESTAMP转换为unix时间,使用time()获取当前unix时间,从当前时间减去生日时间并将其转换为年。