Beiträge Löschen die älter als xx Tage sind

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Beiträge Löschen die älter als xx Tage sind

    Hallo,

    Habe da mal wieder ein Problem.
    In meiner Shoutbox will ich per SQL Beiträge Löschen die älter als xx Tage sind.

    Die sql spalte lautet timestamp mit dem TYP int(11)
    Das Datum wird als time() eingetragen.

    Mein SQL Code

    Source Code

    1. DELETE FROM `shoutbox` WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) >= timestamp


    Anstatt die Einträge zu Löschen die älter als 30 Tage sind Löscht er alle Einträge.
    Klar, das ganze wäre mit

    Source Code

    1. DELETE FROM `table` WHERE `timestamp` < time()-86400;
    ohne Probleme möglich aber gerne hätte ich dies mit Angabe der Tage

    The post was edited 1 time, last by Fragz ().

  • Hallo,

    Hafner wrote:


    Welchen Typ hat denn die Spalte timestamp?


    Der Typ der Spalte ist int(11)

    Hafner wrote:



    Was gibt diese SQL-Query aus?

    Source Code

    1. SELECT DATE_SUB(CURDATE(), INTERVAL 30 DAY), `timestamp` FROM `shoutbox` WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) >= `timestamp` AND `timestamp` > time()-86400


    Einen Fehler

    #1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei ')-86400 LIMIT 0, 30' in Zeile 1


    Noch was, gibt es bei der Abfrage unterschiede was MySQL auf Linux und Windows angeht?

    The post was edited 1 time, last by Fragz ().

  • Stimmt hätte ich auch selber drauf kommen können

    Also das Ergbniss

    MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen). ( die Abfrage dauerte 0.0004 sek. )


    EDIT:

    Lasse ich das ganze wie du es sagtest mit date oder datetime laufen und trage vom PHP Script mit time() ein ist das Datum der 01.01.1970

    Anstatt das ganze über PHPMYADMIN laufen zu lassen habe ich nun im PHP Script versucht wie es auch in der FInal Version sein soll.

    Source Code

    1. $timer = time() - 60 * 24 * 60 * 60;
    2. $timer = intval($timer);
    3. $DB->set_sql('DELETE FROM `cback_portal_shoutbox` WHERE `timestamp` >=:1;');
    4. $DB->execute($timer);
    5. $DB->free();


    Die erste 60 steht für die Tage. Ohne Erfolg. Ich habe 2 Testeionträge, einen von heute und einen vom 01.11.2011 aber er löschte gleich beide Einträge

    The post was edited 2 times, last by Fragz ().

  • Vergiss das mit dem SQL-Statement, das sollte nur die Einträge anzeigen, die von der einen Methode erfasst werden, von der anderen aber nicht. Also einfach nur ein Statement zur Fehleranalyse.

    Lege erstmal deine Testdaten an.

    Dann schaust du erst einmal mit einem SELECT, ob die WHERE-Klausel die richtigen Zeilen erfasst. Hier hab ich die MYSQL-Funktion FROM_UNIXTIME verwendet um deinen INT in ein DATETIME umzuwandeln. Ich gehe davon aus, dass in der Spalte timestamp die Sekunden angegeben sind (und nicht etwa Millisekunden).

    Source Code

    1. SELECT * FROM `shoutbox` WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) >= FROM_UNIXTIME(`timestamp`)


    Wenn das stimmt, kannst du es auch mit DELETE machen.

    Source Code

    1. DELETE FROM `shoutbox` WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) >= FROM_UNIXTIME(`timestamp`)