Обновите значение, используя MySQL Events - PullRequest
1 голос
/ 24 февраля 2011

Я хотел бы создать событие в MySQL, чтобы изменить значение в таблице.Событие проверяет, больше ли дата (в частности, часть TIME () поля TIMESTAMP), чем текущая дата.Очевидно, у меня есть столбец time_stamp и active в таблице с именем '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;

, который тоже не работал.

ТРЕТЬЕ ОБНОВЛЕНИЕ : я использовал предложение Адама, и даже если оно не работает должным образом, оно, безусловно, меняет значение «активное» на 0 сразу после запуска события,Идеи?

РЕШЕНИЕ : Благодаря Адаму я использовал его код с выражением 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 Ответ

5 голосов
/ 24 февраля 2011

Какое значение в active.time_stamp, где active.user_id = 1?

Кроме того, я думаю, что ваше утверждение может быть написано более просто.

  1. Если time_stamp на самом деле содержит метки времени, то вам не нужен вызов TIMESTAMP()**

Вот как я написал ваше утверждение:

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

Другие примечания:
Это может не иметь значения сейчас, но со временем вы в конечном итоге столкнетесь с верхним пределом ВРЕМЯ введите в MySQL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...