Update Wert unter Verwendung von MySQL Veranstaltungen
Möchte ich eine Veranstaltung erstellen in MySQL, um die zu ändern einen Wert in einer Tabelle. Das Ereignis überprüft, ob ein Datum (besonders in der TIME () - Teil einer TIMESTAMP-Feld) ist mehr als das aktuelle Datum. Offensichtlich, ich habe eine time_stamp
und ein active
Spalte in einer Tabelle mit dem Namen 'active'. Dies ist, was ich haben
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;
Soweit ich gesehen habe, die SELECT-Teil mit den Variablen funktioniert, ist, dass TIME_TO_SEC(TIME(@active)) sieht aus wie eine regressive count ab 15 (vorausgesetzt, ich aktualisiert die 'time_stamp' Feld richtig).
Das beabsichtigte Verhalten ist, dass, wenn TIME_TO_SEC(TIME(@active)) den Wert 0 erreichen, wird der UPDATE-query würde ändern Sie den Wert der "aktiv" - Feld von 1 auf 0 (der default-Wert ist 1). Jedoch, es tut nichts.
UPDATE: um genau Zu sein, manchmal ist es ändert den Wert auf 0, aber wenn TIME_TO_SEC(TIME(@active)) ist immer noch positiv.
ZWEITE UPDATE: ich habe vor kurzem versucht, dieses:
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;
das hat nicht funktioniert entweder.
DRITTE UPDATE: ich habe die Anregung von Adam und ich, auch wenn es nicht wie erwartet funktioniert, ist es sicherlich, ändert sich der Wert "aktiv" auf 0, sofort, nachdem ich Anfang der Veranstaltung. Ideen?
LÖSUNG: vielen Dank an Adam, die ich verwendet, seinen code mit einer IF-Anweisung:
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
denen es funktioniert wie vorgesehen. Ich weiß nicht, warum sein Vorschlag nicht funktionieren, obwohl.
Wo habe ich einen Fehler gemacht?
Natürlich ein anderer Ansatz, um diese Funktionalität würde sehr geschätzt werden.
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist der Wert, der in
active.time_stamp
woactive.user_id = 1
?Außerdem denke ich, dass deine Aussage geschrieben werden könnte mehr einfach.
Wenn
time_stamp
in der Tat enthält der Zeitstempel, dann brauchen Sie nicht den Anruf anTIMESTAMP()
.Entfernen, TIME () - Funktion aus dem UPDATE-Abfrage, da TIMEDIFF(expr1,expr2) gibt expr1 – expr2 ausgedrückt als Zeit-Wert.
So ist dies, wie ich schrieb, deine Aussage:
Ich habe getestet, dass wenn der Wert in
active.time_stamp
größer ist als jetzt, ist diese Veranstaltung setzt den Wert inactive.active
0.Wenn das immer noch nicht funktioniert, können Sie auch versuchen, etwas sehr grundlegendes wie:
Und wenn das immer noch nicht funktioniert, dann stellen Sie sicher, dass der event scheduler ausgeführt. Es gibt mehrere Möglichkeiten, um zu starten, dies ist eine:
SET GLOBAL event_scheduler = 1
Sonstige Hinweise:
Das mag nicht jetzt, aber im Laufe der Zeit werden Sie schließlich laufen in der oberen Grenze des ZEIT-Typ in MySQL.