nepixl
Goto Top

SQL: Wenn Datensatz älter als . dann

Guten Morgen werte Community,

habe den Auftrag erhalten, eine kleine Userdatenbank für ein Portal zu bauen.
Das klappt auch recht gut, dafür dass ich kein gelernter Entwickler bin. Jedoch hänge ich nun einige Zeit an einem, für mich größerem, Problem.

Derzeit verwende ich MariaDB auf einer Ubuntu-Minimal VM.

Sobald ein Datensatz angelegt wird, erhält er in der Spalte "registered" das aktuelle Datum + Zeitstempel. (YYYY-MM-DD 00:00:00)
Jetzt sollte ich dafür Sorge tragen, dass gewisse Datensätze automatisch gelöscht / inaktiv gesetzt werden nach idR. 1 Monat; 3 Monate und 6 Monate.
Google brachte so manches Ergebnis, jedoch habe ich es entweder nicht so richtig verstanden was überhaupt passiert oder es einfach nicht wie gewünscht funktioniert. (Testdatenbank angelegt)
Der Zeitraum wird aktuell manuell gesetzt bzw. per Script und händische Auswahl. -Dieser Datensatz bekommt dann die Spalte: "valid" und dort steht da derzeit ganz unprofessionell "1 Monat". (kann nach belieben geändert werden da nur interne Verarbeitung)

Nun meine Frage: wie könnte man dies automatisieren? (automatische Abfrage alle 10 Minuten, ob der Datensatz noch gültig ist (in Bezug auf Erstelldatum), falls nicht: dann ...DEL oder Update (inactive)
Geregelt wird fast alles über PHP.
Würde mich freuen, hier etwas Unterstützung zu finden.

Danke und Grüße
PixL

Edit: SELECT * FROM tabelle WHERE DATEDIFF(feld_mit_datum, NOW()) >= 14
Führt mich leider nicht zum gewünschten Erfolg.

Content-ID: 367984

Url: https://administrator.de/contentid/367984

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

LianenSchwinger
Lösung LianenSchwinger 14.03.2018 um 11:07:26 Uhr
Goto Top
Hallo PixL,

auf Linux-Basis würde ich einen Cron-Job anlegen, der mir vielleicht 1 x am Tag ein Update/Delete-SQL-Statement ausführt.

Übrigens kann Dein WHERE-Bedingung nichts liefern, da DATEDIFF einen negativen Wert ergibt.
Du musst entweder die Reihenfolge im DATEDIFF tauschen oder den Operator ändern.

G LianenSchwinger
nepixl
nepixl 14.03.2018, aktualisiert am 15.03.2018 um 07:34:56 Uhr
Goto Top
Hallo,

mit der Abfrage:
SELECT * FROM deineTabelle WHERE DATEDIFF(NOW(), table-mit-timestamp) >= 30
habe ich mein Problem lösen können.

Nachtrag:
Cron ist hier nicht effizient da es MariaDB von sich aus kann:
CREATE EVENT 30_day_Check
    ON SCHEDULE EVERY 12 HOUR
    DO
      UPDATE deineTabelle SET file_status = 0 WHERE DATEDIFF(NOW(), table-mit-timestamp) >= 30;

Danke an die Community.

Gruß
LianenSchwinger
LianenSchwinger 14.03.2018 um 16:24:53 Uhr
Goto Top
... um so besser wenn es in MariaDB EVENTS gibt. face-smile

G LianenSchwinger
Arano
Arano 14.03.2018 um 16:45:15 Uhr
Goto Top
Hallöchen.

wenn es in MariaDB EVENTS gibt.
Jup, gibt es.
Wollte mich selber etwas dazu belesen weil ich meinte das seine Anforderungen und sein Query nicht zusammenpassen.
MariaDB - create-event

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 12 HOUR 
AT
If you want to execute the event only once (one time event), [...]
Das war mein Gedanke: es läuft nur einmal.
Aber weiterführend heist es dort ja:
You can also specify that an event must be triggered at a regular interval (recurring event). In such cases, use the EVERY clause followed by the interval.


~Arano
nepixl
nepixl 15.03.2018 aktualisiert um 07:41:48 Uhr
Goto Top
Guten Morgen,

use the EVERY clause followed by the interval.
Ah, da ist was dran. Ich editiere meinen Post.

SHOW EVENTS\G;
liefert dann:

*************************** 1. row ***************************
                 Db: MEINEDB
                Name: 30_Abo_Check
             Definer: user@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 2
      Interval field: HOUR
              Starts: 2018-03-15 06:33:41
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci

Besten Dank für den Hinweis.

Gruß
TheJoker2305
TheJoker2305 26.08.2019 um 16:18:11 Uhr
Goto Top
Als alternativen Ansatz würde ich die Datensätze um eine valid_to spalte ergänzen. In dieser steht dann das Ablaufdatum.
Bei Abfragen auf die Tabelle kann dann das Datum am Abfragetag mit dem valid_to Feld verglichen werden.

SELECT * from TABELLE where valid_to > now() or valid_to is null
Zeigt alle Datensätze die aktuell noch gültig sind. Dies in eine VIEW gepackt und schon kann mit den Daten weitegearbeitet werden.

Greetz
thejoker2305