You are not logged in.

  • Login

1

Monday, November 14th 2011, 5:26pm

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

SQL 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

PHP Quellcode

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

This post has been edited 1 times, last edit by "Fragz" (Nov 14th 2011, 8:39pm)


2

Monday, November 14th 2011, 7:59pm

Eher was für's Datenbankforum oder?

Welchen Typ hat denn die Spalte timestamp?

Was gibt diese SQL-Query aus?

SQL Code

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

3

Monday, November 14th 2011, 8:38pm

Hallo,


Welchen Typ hat denn die Spalte timestamp?


Der Typ der Spalte ist int(11)



Was gibt diese SQL-Query aus?

SQL 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

Quoted

#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?

This post has been edited 1 times, last edit by "Fragz" (Nov 14th 2011, 8:44pm)


4

Monday, November 14th 2011, 9:03pm

Och, komm schon. Du kannst ruhig etwas mitdenken.

time() ist genau der Ausdruck, den du in deinem ersten Post verwendet hast.
Ist wohl ne PHP-Funktion, oder?

Fix es halt oder lass zur Not das AND und den Ausdruck dahinter weg.

5

Monday, November 14th 2011, 9:08pm

Naja, wahrscheinlich liegt es eh am Datentyp. Du brauchst date oder datetime. Den int(11)-Wert musst du entsprechend umrechnen.

6

Monday, November 14th 2011, 9:12pm

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

Also das Ergbniss

Quoted

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.

PHP Quellcode

1
2
3
4
5
6
$timer = time() - 60 * 24 * 60 * 60;
$timer = intval($timer);
 
$DB->set_sql('DELETE FROM `cback_portal_shoutbox` WHERE `timestamp` >=:1;');
$DB->execute($timer);
$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

This post has been edited 2 times, last edit by "Fragz" (Nov 14th 2011, 10:12pm)


7

Monday, November 14th 2011, 10:40pm

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).

SQL 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.

SQL Code

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

8

Tuesday, November 15th 2011, 10:53am

Geil, Ich dank dir es klappt.

Social bookmarks