Löschen aller Datensätze ab bestimmten Alter
Hugo Egon Balder
- datenbank
0 Tutti Frutti0 EKKi0 Hugo Egon Balder0 DiBo33
0 dedlfix
Hi Leute,
ich arbeite mit einer MySql Datenbank, auf die ich mittels php zugreife. Dabei verwende ich mysqli. Ich habe nun die Situation, dass bei Aufruf eines Skripts alle Datensätze der Tabelle "warteliste", die älter als 2 Stunden sind, gelöscht werden sollen.
MEIN Lösungsweg ist folgender:
Beim Erstellen dieser Datensätze ermittle ich mit php den aktuellen Unix-Zeitstempel-Wert ($now=time();
)und trage diese Zahl (gemeinsam mit den anderen Daten) als "erstellt" in die Tabelle ein.
Wenn das Skript, das die zu alten Einträge löschen soll, jetzt aufgerufen wird, wird WIEDER der aktuelle Unix-Zeitstempel bestimmt und alle Datensätze, wo die Differenz dann größer als 7200 Sekunden ist (also die gewünschten 2 Stunden), werden gelöscht. Sieht also dann so aus:
date_default_timezone_set("Europe/Berlin");
$now=time();
$reallow=$now-7200;
$deleteolds='DELETE FROM `warteliste` WHERE `erstellt` < ?';
$deletenow=$db->prepare($deleteolds);
$deletenow->bind_param('i',$reallow);
$deletenow->execute();
Was ich jetzt gerne von Euch wissen würde:
Ist dieser Lösungsweg so in Ordnung oder gäbe es da eine elegantere und einfachere Variante mit schlankerem Code? Ich hab schon überlegt, ob ich das vielleicht besser mit den Datums- und Zeitfunktionen von mysql lösen soll (ich habe in JEDER Tabelle nämlich auch einen current-time Zeitstempel, der automatisch miterstellt wird und der somit den Zeitpunkt der erstellung wiedergibt), aber was immer ich da auch bisher gefunden und versucht habe, war länger und komplizierter.
Also meinen Code so belassen oder umändern bzw. einfacher mit mysql Datums- und Zeitfunktionen, aber wenn ja, wie?
Danke im Voraus!
Liebe Grüße
Hugo E.B.
Hi Hugo
Ich find 's gut. Bei einer Differenz von _nur_ 2h ist der Zeitstempel ok.
Gruß Gary
Hi Gary,
Ich find 's gut. Bei einer Differenz von _nur_ 2h ist der Zeitstempel ok.
Und was, wenn ich (nur hypothetisch) alles löschen mag, was vor mehr als 6 Monaten erstellt worden ist? Würdest es da anders lösen?
MfG
Hugo E.B.
Mahlzeit Hugo Egon Balder,
Und was, wenn ich (nur hypothetisch) alles löschen mag, was vor mehr als 6 Monaten erstellt worden ist? Würdest es da anders lösen?
Ich würde es immer gleich lösen.
MfG,
EKKi
Hi Hugo
Und was, wenn ich (nur hypothetisch) alles löschen mag, was vor mehr als 6 Monaten erstellt worden ist? Würdest es da anders lösen?
Ja, definitiv!
Das liegt allein schon daran, daß Monate 28 - 31 Tage haben können und das explizit in den Bereich "Kalender" fällt.
Wie das in PHP geht, keine Ahnung. Ich habe eine ähnliche Situation gehabt. Musste auslaufende Verträge und Geburtstage abfragen. In Perl kein Problem. Dort gibt es Module, die man einbinden kann. In meinem Fall use Date::Calc einbinden und eine der umfangreichen Funktionen nutzen.
Eventuell gibt es bei PHP ähnliche Dinge - wie gesagt - bin kein PHP'ler
Gruß
Gary
Hi Hugo
Und was, wenn ich (nur hypothetisch) alles löschen mag, was vor mehr als 6 Monaten erstellt worden ist? Würdest es da anders lösen?
Ja, definitiv!
Das liegt allein schon daran, daß Monate 28 - 31 Tage haben können und das explizit in den Bereich "Kalender" fällt.
Naja. 6 Monate sind son unpraktischer Begriff. 30 Tage sind 30 Tage, scheißegal welchen Tag wir haben und wieviel Tage irgendein merkwürdiger Monat wohl hat. Wenn ich 6 Monate löschen will, dann loesch ich 180 Tage und fertig. Wenns aus irgendwelchen Gründen mal genauer sein muß, dann kann man immer noch wursteln. Mir fällt aber spontan nix ein. Das macht man um die Datenbank zu entlasten und alten Scheiß loszuwerden. Da ists total wurst, ob man nun bis zum 29. Juli oder 1. August gelöscht hat.
Mahlzeit Hugo Egon Balder,
Beim Erstellen dieser Datensätze ermittle ich mit php den aktuellen Unix-Zeitstempel-Wert (
$now=time();
)und trage diese Zahl (gemeinsam mit den anderen Daten) als "erstellt" in die Tabelle ein.
Warum? MySQL bietet - wie jedes vernünftige rDBMS - brauchbare Funktionen, die mit Datums- und Zeitangaben umgehen können.
Ich hab schon überlegt, ob ich das vielleicht besser mit den Datums- und Zeitfunktionen von mysql lösen soll
Ja.
(ich habe in JEDER Tabelle nämlich auch einen current-time Zeitstempel, der automatisch miterstellt wird und der somit den Zeitpunkt der erstellung wiedergibt),
Warum dann also den Extra-Aufwand mit der Zeitermittlung in PHP usw.? Welches Datenformat hat dieser "Zeitstempel"?
aber was immer ich da auch bisher gefunden und versucht habe, war länger und komplizierter.
Das glaube ich nicht:
DELETE FROM `warteliste`
WHERE TIMESTAMPDIFF(HOUR, `{DEIN_CURRENT_TIME_ZEITSTEMPEL_HIER}`, SYSDATE()) > 2
(d.h. wenn die Differenz zwischen der aktuellen Systemzeit und dem in der Tabelle gespeicherten Zeitpunkt größer als zwei Stunden ist, wird gelöscht)
MfG,
EKKi
Hi EKKi
Warum? MySQL bietet - wie jedes vernünftige rDBMS - brauchbare Funktionen, die mit Datums- und Zeitangaben umgehen können.
Deshalb ja meine Frage. Sowas hab ich eh "befürchtet". ;-) Also danke mal für den Hinweis!
Warum dann also den Extra-Aufwand mit der Zeitermittlung in PHP usw.? Welches Datenformat hat dieser "Zeitstempel"?
Es ist ein ganz normaler Timestamp, sieht also zB so aus: 2009-02-07 17:21:05
Das glaube ich nicht:
DELETE FROM
wartelisteWHERE TIMESTAMPDIFF(HOUR,
{DEIN_CURRENT_TIME_ZEITSTEMPEL_HIER}, SYSDATE()) > 2
Muß ich jetzt den Timestamp der Erstellung jetzt noch irgendwie mit date_format umformatieren? Und da fehlt doch sicher noch was, oder? Woher weiß das System, was ich mit 2 meine? Älter als 2 Stunden, älter als 2 jahre, älter als 2 Tage, .... ??
MfG
Hugo E. B.
Muß ich jetzt den Timestamp der Erstellung jetzt noch irgendwie mit date_format umformatieren?
Nein, lediglich dein Feld eintragen.
Und da fehlt doch sicher noch was, oder? Woher weiß das System, was ich mit 2 meine? Älter als 2 Stunden, älter als 2 jahre, älter als 2 Tage, ....
Hm, was mag wohl HOUR bedeuten?
Hi!
Beim Erstellen dieser Datensätze ermittle ich mit php den aktuellen Unix-Zeitstempel-Wert (
$now=time();
)und trage diese Zahl (gemeinsam mit den anderen Daten) als "erstellt" in die Tabelle ein.Warum? MySQL bietet - wie jedes vernünftige rDBMS - brauchbare Funktionen, die mit Datums- und Zeitangaben umgehen können.
Genau, ein NOW() ins Statement und alles ist erledigt. Kein Erzeugen eines Timestamps und Umwandeln in ein von MySQL erkanntes Datums- und Zeit-String-Format oder FROM_UNIXTIME()-Aufrufe. Und es geht unter Umständen noch kürzer, wenn man die eingebaute Magie des TIMESTAMP-Feldtyps nutzen kann.
(ich habe in JEDER Tabelle nämlich auch einen current-time Zeitstempel, der automatisch miterstellt wird und der somit den Zeitpunkt der erstellung wiedergibt),
Ah, da ist wohl also doch schon so ein TIMESTAMP-Feld vorhanden?
Warum dann also den Extra-Aufwand mit der Zeitermittlung in PHP usw.? Welches Datenformat hat dieser "Zeitstempel"?
Datenformat klingt so verwechselbar. Besser wäre vom Feldtyp zu sprechen. Formate kann man ja beispielsweise in ein String-Feld beliebig viele schreiben.
DELETE FROM warteliste
WHERE TIMESTAMPDIFF(HOUR,
{DEIN_CURRENT_TIME_ZEITSTEMPEL_HIER}
, SYSDATE()) > 2
Ich finde ja das Rechnen mit INTERVAL einfacher zu lesen: WHERE feld < NOW() - INTERVAL 2 HOUR
Lo!
Hi deldfix,
Ah, da ist wohl also doch schon so ein TIMESTAMP-Feld vorhanden?
Also was immer ich auch mit einer DB mache, bei mir hat jede Tabelle (wirklich immer!) als erstes die id-Spalte als Primärschlüssel und als zweites eine timestamp-Spalte, damit die Erstellung des Datensatzes erkennbar/verwendbar ist.
Ich finde ja das Rechnen mit INTERVAL einfacher zu lesen: WHERE feld < NOW() - INTERVAL 2 HOUR
Das war's. Genau sowas hab ich gesucht! Ich wußte ja, wieso ich nachfragen soll, ob das mit den Datums- und Zeitfunktionen von MySql nicht noch einfacher geht. Also danke vielmals für den Hinweis, lieber dedlfix!
Für den Fall mit den 2 Stunden reicht ja wirklich ein
$deleteolds='DELETE FROM `tabelle` WHERE `erstellung` < NOW() - INTERVAL 2 HOUR';
$db->query($deleteolds);
und für den Fall mit den 6 Monaten ein
$deleteolds='DELETE FROM `tabelle` WHERE `erstellung` < NOW() - INTERVAL 6 MONTH';
$db->query($deleteolds);
Nur so nebenbei: Bevor ich die Frage gepostet habe, war ich immer wieder auf der Seite mit den Datums- und Zeitfunktionen. Sowohl auf der Englischen, als auch auf der Deutschen. Aber wie sol man als Nichtinformatiker da je durchblicken und das verstehen? In 100 Jahren wäre ich ohne Dich nicht auf dierse Lösung gekommen! Und auch jetzt im Nachhinein check ich es nicht, wenn ich dort lese. Auf der Englischen Seite in der Tabelle zu Beginn gibt es dieses "INTERVAL" nicht mal in der Übersicht. Auf der Deutschen Seite gibt es nicht mal die Tabelle. Das "INTERVAL" kommt irgendwann so nebenbei ... steht plötzlich mitten in der Funktion ohne größere nähere Erklärung.
Irgendwann kommt dann auch eine Tabelle, vor der steht "Das Schlüsselwort INTERVAL und die Angabe type unterscheiden die Groß-/Kleinschreibung nicht. Die folgende Tabelle zeigt die erwartete Form des Arguments expr für die einzelnen type-Werte." Was jetzt der Unterschied zwischen zB. MONTH und MONTHS ist, ist mir nicht erklärlich. Genausowenig verstehe ich, wozu man zB. Funktionen wie DATEDIFF oder DATE_ADD braucht. Ich verstehe zwar, was da gemacht wird, aber wozu man das braucht, check ich nicht. Was wäre denn da ein konkretes Ziel bei einer DB-Verwendung und wie sähe da dann der Code aus?
Naja, ich werd diese Handbücher nie verstehen und es wird mich immer wieder ärgern, dass Leute, die sowas verfassen, didaktisch nicht in der lage sind, etwas so zu erklären, dass man NICHT studiert haben muß, um es zu verstehen.
Jedenfalls danke nochmals für den Hinweis, wie ich es besser machen kann!
MfG
Hugo E.B.
Hi!
[INTERVAL-Schreibweise finden]
Das ist zugegeben nicht besonders einfach, aber hast du im Funktionsindex nicht die Funktionen mit ADD oder SUB im Namen gefunden? Damit kommst du auch ans Ziel. Die Schreibweise ohne Funktionsaufruf ist quasi auch nur ein Alias zu diesen Funktionen.
Naja, ich werd diese Handbücher nie verstehen und es wird mich immer wieder ärgern, dass Leute, die sowas verfassen, didaktisch nicht in der lage sind, etwas so zu erklären, dass man NICHT studiert haben muß, um es zu verstehen.
Ziel des Handbuchs ist nicht vorrangig Didaktik, sondern umfassende Auflistung der Technik. Wenn du was didaktisch aufbereitetes haben möchtest, musst du im Buchhandel vorbeischauen oder Tutorials suchen. Die lassen dann zugunsten des sonst ausufernden Umfangs oftmals Details weg. Eigentlich braucht man Erläuterungen im Tutorial-Stil mehr oder weniger nur am Anfang. Wenn man fortgeschritten ist, benötigt man vor allem die Information inklusive Details in übersichtlicher Form und nicht als "schwafeligen Roman". Und ja, es ist schwer, Leute zu finden, die Pädagoge, Schriftsteller und Programmierer in Personalunion sind.
Lo!