Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL divisé par plage de temps

Vous avez besoin d'une source de lignes avec toutes les heures que vous souhaitez renvoyer. Ensuite, vous pouvez utiliser une opération JOIN pour sélectionner les lignes à renvoyer.

Si vous aviez un tableau comme celui-ci :

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

Ensuite, vous pouvez l'utiliser dans votre requête :

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 vous voulez les valeurs d'heure dans un format spécifique, vous pouvez utiliser le DATE_FORMAT fonction :

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

Cela suppose que les valeurs renvoyées par la vue sont TIME Type de données. Si ce n'est pas le cas, vous devrez les convertir. (Ou vous pourriez obtenir le même résultat en travaillant avec des chaînes de caractères dans un format canonique.)

REMARQUE :Il n'est pas obligatoire d'avoir une table ; il peut s'agir de n'importe quelle source de ligne, telle qu'une vue en ligne. Vous avez juste besoin de suffisamment de lignes (dans votre cas, en supposant des incréments d'une demi-heure de 00h00 à 23h30, c'est 48 lignes.)

Si vous avez des plages horaires qui "traversent" une limite de minuit (par exemple, de 22h00 à 02h00), l'exemple de requête ne renverra aucune ligne. Vous auriez besoin de faire des ajustements.

Quelque chose comme :

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