sql >> Base de Datos >  >> RDS >> Mysql

MySQL dividido por rango de tiempo

Necesita un origen de fila con todas las veces que desea que se devuelvan. Luego puede usar una operación JOIN para seleccionar las filas que se devolverán.

Si tuvieras una mesa como esta:

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

Entonces podrías usar eso en tu consulta:

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

Si desea los valores de tiempo en un formato específico, puede usar el DATE_FORMAT función:

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

Esto supone que los valores devueltos por la vista son TIME tipo de datos. Si no lo son, querrá convertirlos. (O podría obtener el mismo resultado trabajando con cadenas de caracteres en un formato canónico).

NOTA:No es obligatorio que tengas una mesa; puede ser cualquier fuente de fila, como una vista en línea. Solo necesita suficientes filas (en su caso, suponiendo incrementos de media hora desde las 00:00 hasta las 23:30, son 48 filas).

Si tiene intervalos de tiempo que "cruzan" un límite de medianoche (por ejemplo, de 22:00 a 02:00), la consulta de ejemplo no devolverá ninguna fila. Tendrías que hacer ajustes.

Algo como:

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