Alle Einträge älter als 2 Monate löschen

WernerS

Well-Known Member
#1
HiHo,

ich möchte gerne alle Einträge in der MySQL DB löschen die älter als 2 Monate sind.
Dazu habe ich folgenden Code auf einer Testmaschine benutzt

SQL:
DELETE FROM hs789_order WHERE created_time < (SELECT date_sub(NOW(), INTERVAL 2 month))
In der Spalte created_time ist der aktuelle Timestamp.Nun löscht er aber nicht alles was älter als 2 Monate ist sondern gleich alles.

Wo habe ich dort einen Fehler?
 

lano

Well-Known Member
c-b Experte
#2
So ?
SQL:
DELETE FROM hs789_order WHERE created_time < DATE_SUB(NOW(), INTERVAL 2 MONTH);
 

Mat

Well-Known Member
c-b Experte
#4
Hast du ein paar Beispieldaten für uns? Kann ja sein, dass created_time und NOW() nicht den gleichen Datumtyp verwenden.
 

WernerS

Well-Known Member
#5
Ich habe hier mal die verkürzte Version der Datenbank Tabelle.
Es handelt sich um die Tabelle eines Shops, Quasi der Warenkorb.

Da kommen durch Bots im Monat einige hunderte Einträge zusammen.
Um die DB klein zu halten soll alles nach 2 Monaten gelöscht werden.

SQL:
CREATE TABLE `hs789_order` (
  `id` mediumint(8) UNSIGNED NOT NULL,
  `dv` int(11) DEFAULT NULL,
  `dopt` int(11) DEFAULT NULL,
  `activ` int(11) NOT NULL,
  `created_time` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `hs789_order` (`id`, `dv`, `dopt`, `activ`, `created_time`) VALUES
(8027, NULL, NULL, 0, 1517668452),
(8028, NULL, NULL, 0, 1523457252),
(8029, NULL, NULL, 0, 1528671208),
(8030, NULL, NULL, 0, 1528671210),
(8031, NULL, NULL, 0, 1523430312);
ID 8027, dort ist der Timestamp von Februar 2018 hinterlegt
ID 8031 hat den Timestamp vom 11.04.2018 07:05:37

und die anderen 3 Einträge sind von gestern
 
Zuletzt bearbeitet:

Mat

Well-Known Member
c-b Experte
#6
Jo, du hast INT beim Timestamp. Müsstest das erst in der Abfrage konvertieren, bevor du damit weiterarbeitest. Aber ändere lieber stattdessen den Datentyp des Feldes. Sonst wird es immer wieder Probleme geben.

SQL:
-- Neues Feld mit korrektem Datentyp erzeugen
ALTER TABLE hs789_order ADD COLUMN `created_timestamp` TIMESTAMP NULL DEFAULT NULL;

-- Zeitstempel in neues Feld retten
UPDATE hs789_order SET `created_timestamp` = FROM_UNIXTIME(`created_time`);

-- Funktionstest, bevor wir weitermachen
SELECT * FROM hs789_order WHERE `created_timestamp` < DATE_SUB(NOW(), INTERVAL 2 MONTH);

-- Wenn es bei dir funktioniert, können die alten Daten weg und das Feld kann umbenannt werden
ALTER TABLE hs789_order DROP COLUMN `created_time`;
ALTER TABLE hs789_order CHANGE COLUMN `created_timestamp` `created_time` TIMESTAMP NULL DEFAULT NULL;

-- Jetzt sollte löschen auch klappen
DELETE FROM hs789_order WHERE created_time < DATE_SUB(NOW(), INTERVAL 2 MONTH);
Erhalten die Datensätze direkt beim Anlegen ihre aktuelle created_time? Wenn ja, dann könntest du statt NULL ja NOW() oder CURRENT_TIMESTAMP() oder sowas als Defaultwert nehmen.
 
Oben