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

MySQL diviso per intervallo di tempo

Hai bisogno di un rowsource con tutte le volte che vuoi restituire. Quindi puoi utilizzare un'operazione JOIN per selezionare le righe da restituire.

Se avessi un tavolo come questo:

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

Quindi potresti usarlo nella tua query:

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

Se vuoi che i valori dell'ora siano in un formato specifico, puoi usare il DATE_FORMAT funzione:

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

Ciò presuppone che i valori restituiti dalla vista siano TIME tipo di dati. Se non lo sono, ti consigliamo di convertirli. (Oppure potresti ottenere lo stesso risultato lavorando con stringhe di caratteri in un formato canonico.)

NOTA:non è obbligatorio avere un tavolo; può essere qualsiasi origine di riga, ad esempio una vista in linea. Hai solo bisogno di abbastanza righe (nel tuo caso, supponendo incrementi di mezz'ora dalle 00:00 alle 23:30, sono 48 righe.)

Se sono presenti intervalli di tempo che "attraversano" un limite di mezzanotte (ad es. dalle 22:00 alle 02:00), la query di esempio non restituirà alcuna riga. Dovresti apportare modifiche.

Qualcosa come:

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