MySQL Elemente optimal auslesen

gelleneu

Grünschnabel
Hallo,

ich habe mal eine Frage bezüglich einer Query.
Und zwar habe ich Elemente, die besitzen folgende Felder:

datum_beginn (DATE)
zeit_beginn (TIME)
datum_ende (DATE)
zeit_ende (TIME)

Jetzt möchte ich nur die Elemente filtern, die aktuell in dieser Sekunde sichtbar
sein dürfen. Dazu kommen folgende Bedingungen:


Die Zeiten grenzen den Sichtbarkeitszeitraum ein, das heißt,
wenn alle vier Werte 0 sind, ist das Element IMMER sichtbar.

Wenn nur Uhrzeiten gesetzt sind, ist das Element täglich für den angegeben Zeitraum sichtbar.

Wenn ein Beginnzeitpunkt gesetzt ist, aber der Endzeitpunkt 0, dann ist das Element ab dem Beginnzeitpunkt für immer sichtbar

Wie kann ich das optimal mit MySQL realisieren? Ich habe jetzt eine Lösung mit
vielen WHERE ... AND OR Bedingungen, würde aber gerne auf sowas wie "BETWEEN"
Funktionen wie NOW() und Datetime Felder umsteigen....

Gäbs da ne performantere / sauberere (als meine vorgeschlagene) Lösung für?
 
Zuletzt bearbeitet:
Hallo,

ich würde nicht 0 sondern NULL als Indikator nehmen, dass der Wert irrelevant ist.

Dann könnte man beispielweise folgendes machen:

SQL:
select element_id 
  from tabelle 
 where CURRENT_DATE() between 
       IFNULL(datum_beginn,'1000-01-01') and IFNULL(datum_ende,'9999-12-31') 
   and CURRENT_TIME() BETWEEN
       IFNULL(zeit_beginn,'00:00:00') and IFNULL(zeit_ende,'23:59:59');

Wenn du kein NULL verwenden kannst, musst du das Statement umschreiben etwa so:

SQL:
select element_id 
  from tabelle 
 where CURRENT_DATE() between 
      IF(datum_beginn>0,datum_beginn,'1000-01-01') and IF(datum_ende>0,datum_ende,'9999-12-31') 
   and CURRENT_TIME() between 
      IF(zeit_beginn>0,zeit_beginn,'00:00:00') and IF(zeit_ende>0,zeit_ende,'23:59:59');

Natürlich kann man noch weiter daran optimieren, z.B. mit konformen CASE WHEN Statements arbeiten oder aber die angepassten Datums- und Uhrzeit-Wert kombinieren und erst dann vergleichen (damit spart man sich das zweite AND).

Welche der Lösungen die schnellste ist, kannst du ja dann messen.

Hoffe es hilft als Anfang,

Markus
 
Ah! Vielen Dank, ich werde die Lösung mit NULL nehmen. Dein Ansatz ist um die Ecke gedacht, da er den CURRENT Zeitpunkt als Ausgangspunkt nimmt.
Mein Ansatz war mit vielen "feld <= CURDATE" usw.. gespickt. Es wurden die verschiedenen Kombinationsmöglichkeiten extra abgefragt. Ich denke deine Lösung wird wohl um einiges performanter sein, auf alle Fälle ist sie übersichtlicher.

Mir fehlte da einfach der Denkansatz um BETWEEN richtig einsetzen zu können. Prima! Vielen Dank!
 
Zurück