sql >> Databasteknik >  >> RDS >> Mysql

MySQL uppdelat efter tidsintervall

Du behöver en radkälla med alla tider du vill ha tillbaka. Sedan kan du använda en JOIN-operation för att välja de rader som ska returneras.

Om du hade ett bord som detta:

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;
... 

Då kan du använda det i din fråga:

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

Om du vill ha tidsvärdena i ett specifikt format kan du använda DATE_FORMAT funktion:

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

Detta förutsätter att värdena som returneras av vyn är TIME data typ. Om de inte är det, vill du konvertera dem. (Eller så kan du få samma resultat när du arbetar med teckensträngar i ett kanoniskt format.)

OBS:Det är inte obligatoriskt att du har ett bord; det kan vara vilken radkälla som helst, till exempel en inlinevy. Du behöver bara tillräckligt många rader (i ditt fall, med antagande om halvtimmessteg från 00:00 till 23:30, det är 48 rader.)

Om du har några tidsintervall som "korsar" en midnattsgräns (t.ex. 22:00 till 02:00), kommer exemplet inte att returnera några rader. Du måste göra justeringar.

Något i stil med:

 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
          )
      )



  1. SQL-lagrade procedurparametrar är skadade?

  2. kan vi deklarera markör utanför procedurer i mysql

  3. Uppdatera SQL-läge i MySQL

  4. PostgreSQL:Ge alla behörigheter till en användare på en PostgreSQL-databas