我想在MySQL中创建一个事件,以便更改表中的值。该事件检查日期(特别是TIMESTAMP字段的TIME()部分)是否大于当前日期。显然,我在名为“active”的表中有一个time_stamp
和一个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=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)。但是,它没有做任何事情。
更新:准确地说,有时它会将值更改为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;
也不起作用。
第三次更新:我使用了Adam和我的建议,即使它没有按预期工作,它肯定会在我启动事件后立即将值“active”更改为0。想法?
解决方案:感谢Adam,我将他的代码用于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
它按预期工作。不过,我不知道为什么他的建议不起作用。
我在哪里弄错了?
当然,非常感谢另一种获得此功能的方法。
提前致谢。
答案 0 :(得分:5)
active.time_stamp
active.user_id = 1
的价值是多少?
另外,我认为您的陈述可能更简单。
如果time_stamp
实际上包含时间戳,那么您不需要拨打TIMESTAMP()
。
从UPDATE查询中删除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的上限。