MySQL - Löschen wenn - mysql

Ich habe ein Skript, das täglich eine Textdatei aktualisiert. Es löscht alle Datensätze des aktuellen Monats als ersten Schritt.

DELETE FROM salesdata
WHERE year(calendar_date) = year(now())
AND month(calendar_date) = month(now());

An den ersten drei Tagen des Monats die Textdateienthält Daten des Vormonats. (Die Art und Weise, wie die Textdatei und die Kundenaufträge generiert werden, Aufträge können sich ändern oder für einige Tage gelöscht werden, nachdem sie gepostet wurden. Der einfachste Weg, dies zu berücksichtigen, ist nur die tägliche vollständige Aktualisierung).

Ich würde gerne so etwas machen:

IF DAY(calendar_date) <= 3
DELETE FROM salesdata
WHERE year(calendar_date) = year(now())
AND month(calendar_date) = month(now()) - 1
OR month(calendar_date) = month(now());
ELSE
DELETE FROM salesdata
WHERE year(calendar_date) = year(now())
AND month(calendar_date) = month(now());

Kann ich das in MySQL machen? Ich habe mir die IF- und CASE-Statements angeschaut, aber ich habe nichts gesehen, was dies unterstützt.

Antworten:

0 für die Antwort № 1

Warum brauchst du if? Darum gibt es where Klauseln ...

DELETE ...
WHERE (year/month stuff AND (DAY(calendar_date) <= 3))
OR (..other stuff..)

0 für die Antwort № 2

Sie können die folgende Abfrage versuchen:

DELETE FROM salesdata
where
year(calendar_date) = year(now())
AND (
(DAY(calendar_date)<=3 and month(calendar_date) = month(now())- 1)
OR month(calendar_date) = month(now())
)

0 für die Antwort № 3

IF Anweisungen können nur in gespeicherten Prozeduren und nicht in Abfragen verwendet werden. In einer Abfrage müssen Sie die Bedingung in die WHERE Klausel, und Sie können die verwenden IF() Funktion.

DELETE FROM salesdata
WHERE YEAR(calendar_date) = YEAR(now())
AND IF(DAY(NOW()) <= 3,
MONTH(calendar_date) IN (MONTH(NOW(), MONTH(NOW()) - 1),
MONTH(calendar_date) = MONTH(NOW()))

Dies geht jedoch nicht gut mit dem Jahresanfang um. Statt Jahr und Monat zu vergleichen, wäre es besser, ganze Daten zu vergleichen und Datumsarithmetik zu verwenden.

DELETE FROM salesdata
WHERE calendar_date >=
DATE_FORMAT("%Y-%m-01",
IF(DAY(NOW()) <= 3, NOW(), DATE_SUB(NOW(), INTERVAL 1 MONTH)))