2017-04-21 2 views
0

angegeben ist Ich habe eine Jobtabelle mit einer "Schlafphase", und ich möchte keine Zeilen im Bereich zwischen sleep_start und sleep_end zurückgeben.Zeilen im Zeitbereich überspringen, der in Tabelle

CREATE TABLE `jobs` (
    `job_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    `sleep_start` time DEFAULT NULL, 
    `sleep_end` time DEFAULT NULL, 
    PRIMARY KEY (`account_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Jeder Job hat einen Zeitrahmen, wo sie nicht genannt werden sollten, die 00:00:00 in einem Zeitformat angegeben wird

Dann möchte ich würde eine Abfrage wie

SELECT * FROM jobs WHERE TIME(NOW()) NOT BETWEEN sleep_start AND sleep_end 

laufen und nur bekommen Jobs, die nicht schlafen.

Jetzt scheint dies zu funktionieren, wenn sleep_start und sleep_end am selben Tag sind und die Zeitspanne 00:00:00 nicht überschreitet. In diesem Fall werden diese Zeilen immer zurückgegeben.

Wie kann ich die Abfrage ändern, damit sie in allen Szenarien funktioniert?

+0

'' 'SELECT * FROM Jobs WO NICHT ZEIT (NOW()) BETWEEN sleep_start AND sleep_end'''' –

+0

Spanning Mitternacht macht für chaotischen Code; kann es nicht in einem einfachen Ausdruck tun. –

+0

Vielleicht wäre es einfacher, die Abfrage zu ändern und mit der 'start' Zeit zu bleiben, aber' sleep_end' in 'sleep_duration' int zu ändern, die die Schlafzeit in Stunden enthält, dann ein Datum aus der Zeit und heute, gleich mit + Intervall konstruieren X Stunden – maddo7

Antwort

0

Von Ihrer Beschreibung des Problems, Ihre Zeit Spalten, um die Uhrzeit zu repräsentieren, und dass, wenn sleep_start < sleep_end dann sollten wir annehmen, sleep_end ist am nächsten Tag.

Sie müssen nur beide Fälle testen.

SELECT * FROM jobs 
WHERE TIME(NOW()) NOT BETWEEN sleep_start AND sleep_end 
AND NOT (sleep_start > sleep_end AND 
    (TIME(NOW()) >= sleep_start OR TIME(NOW()) <= sleep_end)); 

Die erste Prüfung (die BETWEEN-Klausel) ist der Fall, in dem sleep_start <= sleep_end. Aber es muss nicht explizit danach suchen, denn NOW() wird niemals zwischen ihnen liegen, es sei denn, es ist wahr.

Die zweite Hälfte enthält die Überprüfung für sleep_start > sleep_end, und wenn das der Fall ist, überprüft es für NOW() nach der späteren Zeit oder vor der früheren Zeit.

+0

Sagen wir, Start ist 23:00 und Ende ist 02:00 die zweite Hälfte der Abfrage wäre dann 02: 00-23: 00 das wäre nicht beabsichtigt – maddo7

+0

Sie haben Recht. Tut mir recht, wenn ich versuche, das in meinem Kopf zu tun! Ich werde die zweite Abfragebedingung umschreiben. – Bampfer

Verwandte Themen