sql >> Database teknologi >  >> RDS >> Mysql

MySQL opdelt efter tidsinterval

Du skal bruge en rowsource med alle de tider, du vil have returneret. Derefter kan du bruge en JOIN-operation til at vælge de rækker, der skal returneres.

Hvis du havde et bord som dette:

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

Så kan du bruge det i din forespørgsel:

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
 

Hvis du vil have tidsværdierne i et bestemt format, kan du bruge DATE_FORMAT funktion:

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

Dette forudsætter, at værdierne returneret af visningen er TIME datatype. Hvis de ikke er det, vil du gerne konvertere dem. (Eller du kan få det samme resultat ved at arbejde med tegnstrenge i et kanonisk format.)

BEMÆRK:Det er ikke obligatorisk, at du har et bord; det kan være en hvilken som helst rækkekilde, såsom en indlejret visning. Du skal bare bruge nok rækker (i dit tilfælde, antaget en halv times intervaller fra 00:00 til 23:30, det er 48 rækker).

Hvis du har nogen tidsintervaller, der "krydser" en midnatsgrænse (f.eks. 22:00 til 02:00), returnerer eksempelforespørgslen ikke nogen rækker. Du bliver nødt til at foretage justeringer.

Noget som:

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. Yii2 QueryBuilder-opdatering med Join

  2. Hvorfor bruge INCLUDE-sætningen, når du opretter et indeks?

  3. Læsning af delvise json-data med MySQL og PHP

  4. PHP og SQL Hashing Hjælp:Hvad gør jeg forkert?