使用MySQL Events更新值

时间:2011-02-24 03:01:01

标签: mysql events datetime

我想在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

它按预期工作。不过,我不知道为什么他的建议不起作用。


我在哪里弄错了?

当然,非常感谢另一种获得此功能的方法。

提前致谢。

1 个答案:

答案 0 :(得分:5)

active.time_stamp active.user_id = 1的价值是多少?

另外,我认为您的陈述可能更简单。

  1. 如果time_stamp实际上包含时间戳,那么您不需要拨打TIMESTAMP()

  2. 从UPDATE查询中删除TIME()函数,因为TIMEDIFF(expr1,expr2) returns expr1 – expr2 expressed as a time value

  3. 所以这就是我写你的陈述的方式:

    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的上限。