2011-02-24 73 views
1

我想在MySQL中創建一個事件,以便更改表中的值。該事件檢查日期(特別是TIMESTAMP字段的TIME()部分)是否大於當前日期。很明顯,我在名爲'active'的表中有一個time_stamp和一個active列。這是我使用MySQL事件更新值

CREATE EVENT update_status 
ON SCHEDULE EVERY 2 SECOND 
DO 
SELECT @time:= time_stamp FROM active WHERE user_id = 1; 
SELECT @time2:= TIMESTAMP(@time); 
SELECT @active:=TIMEDIFF(@time2,DATE_ADD(NOW(),INTERVAL -15 SECOND)); 
UPDATE active SET active=if(TIME_TO_SEC(TIME(@active))>=0,1,0) WHERE user_id=1; 

據我所看到的,與變量SELECT部分​​工作正常,也就是TIME_TO_SEC(TIME(@active))貌似開始15(提供我一個倒退數更新了'time_stamp'字段)。

預期的行爲是當TIME_TO_SEC(TIME(@active))達到0時,UPDATE查詢會將'active'字段的值從1更改爲0(默認值爲1)。但是,它什麼都不做。

UPDATE:確切地說,它有時會將值更改爲0,但是當TIME_TO_SEC(TIME(@active))仍爲正數時。

第二次更新:我最近嘗試這一個:

CREATE EVENT update_status 
ON SCHEDULE EVERY 2 SECOND 
DO 
SELECT @time:= time_stamp FROM active WHERE user_id = 1; 
SELECT @time2:= TIMESTAMP(@time); 
SELECT @active:=TIMEDIFF(@time2,DATE_ADD(NOW(),INTERVAL -15 SECOND)); 
UPDATE active SET active=0 WHERE user_id=1 AND TIME_TO_SEC(TIME(@active))>=0; 

這也不能工作。

第三次更新:我使用亞當和我的建議,即使它不像預期的那樣工作,它肯定會在開始事件後立即將值'active'更改爲0。想法?

SOLUTION:感謝亞當,我用他的IF語句代碼:

CREATE EVENT update_status 
ON SCHEDULE EVERY 2 SECOND 
Do 
UPDATE active AS t 
SET t.active=IF(TIME_TO_SEC(TIMEDIFF(
t.time_stamp, DATE_ADD(NOW(), 
INTERVAL -15 SECOND)))>=0,1,0) 
WHERE user_id=1 

它按預期工作。不過,我不明白他的建議不起作用。


我在哪裏犯了一個錯誤?

當然,另一種獲得此功能的方法將不勝感激。

在此先感謝。

回答

5

active.time_stamp其中active.user_id = 1是什麼值?

另外,我認爲你的陳述可能寫得更簡單。

  1. 如果time_stamp其實包含時間戳,那麼你不需要調用TIMESTAMP()

  2. 從更新查詢中刪除TIME()函數,因爲TIMEDIFF(expr1,expr2) returns expr1 – expr2 expressed as a time value

所以我這是怎麼寫你的發言:

CREATE EVENT update_status 
ON SCHEDULE EVERY 2 SECOND 
DO 
UPDATE active t 
SET t.active = 0 
WHERE t.user_id = 1 
AND TIME_TO_SEC(
    TIMEDIFF(
     t.time_stamp, DATE_ADD(NOW(),INTERVAL -15 SECOND) 
    ) 
)>=0; 

我測試過,當在active.time_stamp值大於現在,這一事件將在active.active爲0

如果仍然不能正常工作,你也可以嘗試一些非常基本的,如:

CREATE EVENT update_status_test 
ON SCHEDULE EVERY 1 SECOND 
DO 
UPDATE active t 
SET t.active = 0 
WHERE t.user_id = 1; 

如果仍然無法正常工作,請確保事件調度程序實際上正在運行。有幾種方法來啓動它,這是一個:SET GLOBAL event_scheduler = 1

其他說明:
這可能無所謂了,但隨着時間的推移,你最終會碰到TIME type in MySQL的上限。

+0

非常感謝您的回答。 active.time_stamp的值是常規的TIMESTAMP值(例如2011-02-24 00:09:06)。我喜歡你對查詢的簡化,但是,它不起作用。儘管如此,你的第二個代碼段仍然有效。順便說一句,我使用TIMESTAMP(),即使該值已經是TIMESTAMP,因爲當我設置一個變量(例如@time)時,它不保留格式;相反,它顯示了一些帶有一些字母的長數字。還有什麼想法? – 2011-02-24 14:27:21

+0

爲了防萬一它可能是相關的,我使用本地主機。順便說一下,我認爲你的意思是「更新主動** AS ** t」。 – 2011-02-24 14:28:53

+0

我接受了你的回答,但是我在問題中發佈了工作解決方案作爲編輯:-) – 2011-03-02 05:58:33