更新MySQL中的年龄列

时间:2012-03-21 06:21:01

标签: mysql

我有一个用户表,用户的生日(YYYY-MM-DD)以及年龄。我想运行一个脚本来计算每晚通过cron更新年龄列。

此SQL适用于选择和计算年龄:

SELECT 
    DATE_FORMAT(NOW(), '%Y') - 
    DATE_FORMAT(`birthday`, '%Y') - 
    (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`birthday`, '00-%m-%d')) AS age
FROM 
    `jos_jcourse_students`

但是,是否可以使用单个语句更新年龄列?试过以下内容,但我设法做的就是用全0填充年龄栏!我需要使用某种MySQL循环吗?

UPDATE 
    `jos_jcourse_students` 
SET 
    age = "SELECT DATE_FORMAT(NOW(), '%Y') - 
    DATE_FORMAT(`birthday`, '%Y') - 
    (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`birthday`, '00-%m-%d')) AS age
FROM 
    `jos_jcourse_students`"

3 个答案:

答案 0 :(得分:3)

UPDATE `jos_jcourse_students` 
SET age = DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 

根据你的逻辑,它将是

UPDATE `jos_jcourse_students` 
SET age =((DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`birthday`, '%Y')) - 
    (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`birthday`, '00-%m-%d'))) 

答案 1 :(得分:0)

UPDATE 
    `jos_jcourse_students` 
SET
    age = (SELECT DATE_FORMAT(NOW(), '%Y') - 
    DATE_FORMAT(`birthday`, '%Y') - 
    (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`birthday`, '00-%m-%d')) AS age
FROM 
`jos_jcourse_students`)

答案 2 :(得分:0)

使用自连接技术可以实现上述结果的一种方法。即使用其唯一ID(主键示例studentId)

连接到同一个表
UPDATE jos_jcourse_students a, 
      ( SELECT studentId, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`birthday`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`birthday`, '00-%m-%d')) AS age
        FROM `jos_jcourse_students`) b
SET a.age = b.age
WHERE a.studentId = b.studentId

注意: studentId 是jos_jcourse_students中的主键