2012-03-21 3 views
1

J'ai une table utilisateur avec l'utilisateur de anniversaire (AAAA-MM-JJ) ainsi que l'âge . Je veux exécuter un script pour calculer et mettre à jour la colonne d'âge tous les soirs via cron.colonne age Mise à jour MySQL

Cette SQL fonctionne bien pour la sélection et le calcul de l'âge:

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` 

Mais est-il possible de mettre à jour la colonne d'âge avec une seule déclaration? Je ai essayé ce qui suit, mais tout ce que j'ai réussi à faire était de peupler la colonne d'âge avec tous les 0! Ai-je besoin d'utiliser une sorte de boucle 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`" 
+0

vous avez essayé cette requête à la fois? –

+1

La colonne d'âge semble redondante ici. Une raison pour laquelle vous ne pourriez pas vous en débarrasser complètement et calculer l'âge au besoin? Pas comme si c'était compliqué d'un calcul ... :) – cHao

+0

ouais, on aurait pu s'en débarrasser, mais ça a déjà été programmé de cette façon donc on ne veut pas changer la structure db;) – lee

Répondre

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

ou selon votre logique, il sera

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'))) 
+0

semble fonctionner - qu'est-ce que je manque en utilisant ce calcul plus court contre l'original? – lee

+0

le calcul est correct. Vous n'avez pas besoin d'utiliser la mise à jour sélectionnez ... ce sera OK avec l'utilisation de la mise à jour –

+0

, merci! – lee

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`) 
+0

a eu une erreur de syntaxe à ce sujet. .. – lee

+0

Je suppose que j'ai oublié la dernière parenthèse ... s'il vous plaît essayez maintenant – NarayaN

0

Une façon vous pouvez obtenir le résultat ci-dessus en utilisant la technique de jointure auto. i.e. joindre à la même table en utilisant son identifiant unique (par exemple clé primaire 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 

Note: StudentID est la clé primaire dans jos_jcourse_students