我想在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
它按預期工作。不過,我不明白他的建議不起作用。
我在哪裏犯了一個錯誤?
當然,另一種獲得此功能的方法將不勝感激。
在此先感謝。
非常感謝您的回答。 active.time_stamp的值是常規的TIMESTAMP值(例如2011-02-24 00:09:06)。我喜歡你對查詢的簡化,但是,它不起作用。儘管如此,你的第二個代碼段仍然有效。順便說一句,我使用TIMESTAMP(),即使該值已經是TIMESTAMP,因爲當我設置一個變量(例如@time)時,它不保留格式;相反,它顯示了一些帶有一些字母的長數字。還有什麼想法? – 2011-02-24 14:27:21
爲了防萬一它可能是相關的,我使用本地主機。順便說一下,我認爲你的意思是「更新主動** AS ** t」。 – 2011-02-24 14:28:53
我接受了你的回答,但是我在問題中發佈了工作解決方案作爲編輯:-) – 2011-03-02 05:58:33