Sven Rautenberg: Eine Lösung in MySQL gefunden, neues Problem erfunden!

Beitrag lesen

Moin!

Nochmal gaaanz kurz nachgedacht und Fehler entdeckt:

$sql = "delete from LOGIN
        where unix_timestamp(LOGINTIME) < (unix_timestamp(now()) - 3600)";

Die Funktion now() gibt leider den Timestamp auch als DateTime formatiert zurück. mann muss also erst wieder zurückrechnen.

Warum so kompliziert mit der Unix-Timestamp? LOGINTIME ist vom Typ DateTime, now() gibt diesen Typ auch zurück. Fehlt noch das Subtrahieren von einer Stunde:

DATE_SUB(now(),INTERVAL 1 HOUR)

Möglicherweise gehts auch simpel so (seit MySQL 3.23):

NOW() - INTERVAL 1 HOUR

Fertig. Und wunderbar lesbar.

Ich frage mich allerdings, wozu du in deinem ersten Beispiel noch eine TIMESTAMP-Spalte eingefügt hast?

Zu berücksichtigen wäre noch, WANN die Funktion now() evaluiert wird:
Schließlich dauert es bei großen Datenbeständen schon ein paar Sekunden vom ersten bis zum letzten Datensatz

Wäre das relevant? Wenn now() zu Beginn evaluiert wird, werden alle exakt zum Startzeitpunkt zu alten Datensätze gelöscht. Wenn now() fortschreitend neu evaluiert wird, werden alle Datensätze gelöscht, die zum Löschzeitpunkt zu alt sind (und gelöscht würden, wäre nur Fall a) aktiv und erteilte man das Kommando  erneut).

In beiden Fällen werden ganz grob gesehen alle Datensätze gelöscht, die älter als eine Stunde sind.

Ich tendiere aber dazu, dass now() genau einmal beim Start evaluiert wird.

- Sven Rautenberg

--
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)