使用MySQL Events更新值

Rob*_*ith 1 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;
Run Code Online (Sandbox Code Playgroud)

据我所知,带有变量的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;
Run Code Online (Sandbox Code Playgroud)

这也没用.

第三次更新:我使用了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
Run Code Online (Sandbox Code Playgroud)

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


我在哪里弄错了?

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

提前致谢.

ber*_*nie 5

什么价值在active.time_stamp哪里active.user_id = 1

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

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

  2. 从UPDATE查询中删除TIME()函数,因为TIMEDIFF(expr1,expr2)返回表示为时间值的expr1 - expr2.

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

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;
Run Code Online (Sandbox Code Playgroud)

我已经测试过,当值in active.time_stamp大于now时,此事件将值设置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;
Run Code Online (Sandbox Code Playgroud)

如果仍然无法正常工作,请确保事件调度程序实际上正在运行.有几种方法可以启动它,这是一种方法:SET GLOBAL event_scheduler = 1

其他注意事项:
现在这可能无关紧要,但随着时间的推移,最终会遇到MySQL中TIME类型的上限.