Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL nach Zeitbereich aufgeteilt

Sie benötigen eine Rowsource mit allen Zeiten, die Sie zurückgeben möchten. Dann können Sie eine JOIN-Operation verwenden, um die zurückzugebenden Zeilen auszuwählen.

Wenn Sie eine Tabelle wie diese hätten:

CREATE TABLE cal (tm TIME NOT NULL PRIMARY KEY) ENGINE=InnoDB ;
INSERT INTO cal (tm)  VALUES ('00:00:00'),('00:30:00');
INSERT INTO cal (tm) SELECT ADDTIME(tm,'01:00:00') FROM cal;
INSERT INTO cal (tm) SELECT ADDTIME(tm,'02:00:00') FROM cal;
INSERT INTO cal (tm) SELECT ADDTIME(tm,'04:00:00') FROM cal;
... 

Dann könnten Sie das in Ihrer Abfrage verwenden:

SELECT v.id
     , c.tm
  FROM myview v
  JOIN cal c
    ON c.tm >= v.hour_from
   AND c.tm <= v.hour_to
 ORDER BY v.id, c.tm

Wenn Sie die Zeitwerte in einem bestimmten Format wünschen, können Sie das DATE_FORMAT verwenden Funktion:

SELECT v.id
     , DATE_FORMAT(c.tm,'%H:%i') AS hour_

Dies setzt voraus, dass die von der Ansicht zurückgegebenen Werte TIME sind Datentyp. Wenn dies nicht der Fall ist, sollten Sie sie konvertieren. (Oder Sie könnten dasselbe Ergebnis erhalten, wenn Sie mit Zeichenfolgen in einem kanonischen Format arbeiten.)

HINWEIS:Es ist nicht zwingend erforderlich, dass Sie einen Tisch haben; es kann sich um eine beliebige Zeilenquelle handeln, z. B. eine Inline-Ansicht. Sie brauchen nur genügend Zeilen (in Ihrem Fall, wenn Sie Halbstundenschritte von 00:00 bis 23:30 annehmen, sind das 48 Zeilen.)

Wenn Sie Zeitbereiche haben, die eine Mitternachtsgrenze "überschreiten" (z. B. 22:00 bis 02:00), gibt die Beispielabfrage keine Zeilen zurück. Sie müssten Anpassungen vornehmen.

Etwas wie:

 JOIN cal c
   ON ( t.hour_from <= t.hour_to 
      AND c.tm >= v.hour_from
      AND c.tm <= v.hour_to
      )
   OR ( t.hour_from > t.hour_to 
      AND (   c.tm <= v.hour_from
          OR  c.tm >= v.hour_to
          )
      )