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

Beitrag lesen

Hello,

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:

Mag sein, dass das an meiner Bedienpberfläche liebt. Habe jetzt kein extra Script dafür aufgebaut, aber datetime gibt das Format 2003-10-28 12:08:45 zurück und das wird auch von now() ausgegeben.

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?

Es ging nur um die Differenzierung zwischen datetime und timestamp. Timestamp wird automatisch gepfelgt und symbolisiert daher immer den letzten Zugriff auf dem Datensatz und DateTime muss explizit gesetzt werden, und eigenet sich daher z.B. für das erste Auftreten eines Ereignisses. Also z.B. nur setzen bei insert.

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.

Aber auch nur _ganz_ grob!

Ich lasse die Frage, wann und wie oft now() evaluiert wird, trotzdem auf meiner Liste. Ich wüsste nur nicht, wie ich das mit meinen paar Datensätzen ausprobieren sollte.

Grüße

Tom