使用MySQL事件更新值

使用MySQL事件更新值,mysql,events,datetime,Mysql,Events,Datetime,我想在MySQL中创建一个事件来更改表中的值。事件检查日期,特别是时间戳字段的时间部分是否大于当前日期。显然,我在一个名为“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 @

我想在MySQL中创建一个事件来更改表中的值。事件检查日期,特别是时间戳字段的时间部分是否大于当前日期。显然,我在一个名为“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部分工作得很好,也就是时间_SECTIME@active如果我正确更新了“时间戳”字段,则看起来是从15开始的回归计数

预期的行为是,当时间_SECTIME@active如果达到0,更新查询会将“活动”字段的值从1更改为0。默认值为1。然而,它什么也不做

更新:准确地说,有时它会将值更改为0,但当时间更改为_SECTIME@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
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.user\u id=1时,active.time\u stamp中的值是多少

此外,我认为你的发言可能写得更简单一些

如果time_stamp实际上包含时间戳,则不需要调用TIMESTAMP

从更新查询中删除时间函数,因为

我就是这样写你的声明的:

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
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;
如果这仍然不起作用,那么请确保事件调度程序正在实际运行。有几种方法可以启动它,这是一种:设置全局事件\u调度程序=1

其他说明: 现在这可能无关紧要,但随着时间的推移,您最终会遇到的上限。

active.time\u stamp中的值是多少,其中active.user\u id=1

此外,我认为你的发言可能写得更简单一些

如果time_stamp实际上包含时间戳,则不需要调用TIMESTAMP

从更新查询中删除时间函数,因为

我就是这样写你的声明的:

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
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;
如果这仍然不起作用,那么请确保事件调度程序正在实际运行。有几种方法可以启动它,这是一种:设置全局事件\u调度程序=1

其他说明:
现在这可能无关紧要,但随着时间的推移,您最终将达到上限。

非常感谢您的回答。active.time_stamp的值是常规时间戳值,例如2011-02-24 00:09:06。我喜欢你对查询的简化,但是它不起作用。不过,您的第二个代码片段起了作用。顺便说一下,即使值已经是时间戳,我也使用了时间戳,因为当我设置变量@time时,它没有保留格式;相反,它显示了一个带有一些字母的长数字。还有其他想法吗?为了以防万一,我正在使用localhost。顺便说一句,我想你的意思是更新活动为t。我接受了你的答案,但我发布了工作解决方案作为问题的编辑:-非常感谢你的回答。active.time_stamp的值是常规时间戳值,例如2011-02-24 00:09:06。我喜欢你对查询的简化,但是它不起作用。不过,您的第二个代码片段起了作用。顺便说一下,即使值已经是时间戳,我也使用了时间戳,因为当我设置变量@time时,它没有保留格式;相反,它显示了一个带有一些字母的长数字。还有其他想法吗?为了以防万一,我正在使用localhost。顺便说一下,我想你的意思是以t的形式更新活动。我接受了你的答案,但我在问题中以编辑的形式发布了工作解决方案:-