2012-03-30 19 views
0

Ich habe ein Szenario, in dem ich in der Lage sein soll, Zeilen aus einer MySQL-Tabelle auszuwählen, aber Zeilen ausschließen, in denen die aktuelle Tageszeit innerhalb eines Zeitbereichs liegt.Die MySQL-Struktur für einen Zeitbereich für die Abfrageoptimierung korrigieren?

Beispiel: Die "ruhige" Periode für eine Reihe ist 22.00 Uhr - 8.30 Uhr. Meine SQL SELECT-Anweisung sollte diese Zeile nicht zurückgeben, wenn die aktuelle Serverzeit nach 22 Uhr oder vor 8:30 Uhr liegt.

Beispiel 2: Die "Ruhezeit" ist NULL und wird ignoriert.

Beispiel 3: Eine neue Zeile wird mit einer ruhigen Periode von 9:53 Uhr bis 9:55 Uhr erstellt. Wenn sich die aktuelle Serverzeit in diesem 2-Minuten-Fenster befindet, wird die Zeile von SELECT nicht zurückgegeben.

Meine Frage: Welches Datenformat würden Sie in der Datenbank verwenden und wie würden Sie die Abfrage schreiben?

Ich habe über ein paar verschiedene Ansätze nachgedacht (start_time als eine Spalte definieren und die Dauer als andere, definieren beide in Sekunden ... oder mit Datumsstempel ... oder was auch immer). Keine von ihnen scheint ideal und erfordert eine Menge Berechnung.

Danke!

+0

Benötigen Sie nur die Zeit für jede Zeile oder benötigen Sie auch das Datum? – liquorvicar

+0

Ich muss auch nicht zurückkehren. Ich versuche nur basierend auf der Tageszeit zu filtern. Ich interessiere mich nicht für Date. Wie bei meinem obigen Beispiel: Ich möchte Zeilen ausschließen, in denen sich die aktuelle Server-Tageszeit innerhalb des angegebenen "stillen Fensters" befindet. –

Antwort

2

Ich würde die Start- und Enddaten als MySQL native TIME Felder speichern. Sie müssten Bereiche berücksichtigen, die Mitternacht als zwei getrennte Bereiche erstrecken, aber sie wäre in der Lage, die Tabelle wie folgt abgefragt werden, um alle aktuellen Ruheperioden

SELECT DISTINCT name FROM `quiet_periods` 
WHERE start_time<=CURTIME() AND CURTIME()<=end_time 

zu finden oder alle nicht aktiven Ruheperioden finden

SELECT name FROM quiet_periods WHERE name NOT IN (
    SELECT name FROM `quiet_periods` 
    WHERE start_time<=CURTIME() AND CURTIME()<=end_time 
) 

So mit Beispieldaten

id -- name  -- start_time -- end_time 
1 -- late_night -- 00:00:00 -- 08:30:00 
2 -- late_night -- 22:00:00 -- 23:59:59 
3 -- null_period -- NULL  -- NULL 
4 -- nearly_10am -- 09:53:00 -- 09:55:00 

um 11 Uhr würde diese Rückkehr

null_period 
nearly_10am 

aus der zweiten Abfrage.

Je nach Leistung und wie viele Zeilen Sie hatten, könnten Sie die zweite Abfrage in einen JOIN umwandeln und wahrscheinlich auch die entsprechenden INDEXen hinzufügen.

+0

Schön gemacht! Mitternacht war das Problem, über das ich nachdachte, und ich hatte gehofft, es könnte getan werden, ohne eine zweite Tabelle hinzuzufügen und einen JOIN zu machen, aber naja = P –