2012-03-21 60 views
1

我有一個用戶表,其中包含用戶的生日(YYYY-MM-DD)以及年齡。我想運行一個腳本來計算通過cron每晚更新年齡欄。MySQL中的更新時間列

這個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`" 
+0

你一次嘗試這樣的查詢? – 2012-03-21 06:27:17

+1

年齡層在這裏似乎是多餘的。任何你無法完全擺脫它的原因,並根據需要計算年齡?不喜歡它是一個複雜的計算... :) – cHao 2012-03-21 06:29:48

+0

是的,本來可以擺脫它,但它已經被編程,所以不想改變數據庫結構;) – lee 2012-03-21 06:46:10

回答

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

似乎工作 - 我通過使用這個較短的計算與原來的錯過了什麼? – lee 2012-03-21 06:37:17

+0

計算正常。你不需要使用更新選擇...它會好的只是使用更新 – 2012-03-21 06:40:04

+0

瞭解它,謝謝! – lee 2012-03-21 06:44:06

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

得到了一個語法錯誤。 .. – lee 2012-03-21 06:37:38

+0

我想我忘了最後一個支架...請現在嘗試 – NarayaN 2012-03-21 06:44:45

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主鍵