Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL dividido por intervalo de tempo


Você precisa de uma fonte de linha com todas as vezes que deseja retornar. Em seguida, você pode usar uma operação JOIN para selecionar as linhas a serem retornadas.

Se você tivesse uma tabela assim:
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;
... 

Então você pode usar isso em sua 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

Se você quiser os valores de tempo em um formato específico, você pode usar o DATE_FORMAT função:
SELECT v.id
     , DATE_FORMAT(c.tm,'%H:%i') AS hour_

Isso pressupõe que os valores retornados pela visualização sejam TIME tipo de dados. Se não forem, você desejará convertê-los. (Ou você pode obter o mesmo resultado trabalhando com cadeias de caracteres em um formato canônico.)

NOTA:Não é obrigatório ter mesa; pode ser qualquer origem de linha, como uma exibição em linha. Você só precisa de linhas suficientes (no seu caso, assumindo incrementos de meia hora de 00:00 a 23:30, são 48 linhas).

Se você tiver intervalos de tempo que "cruzem" um limite de meia-noite (por exemplo, 22h às 02h), a consulta de exemplo não retornará nenhuma linha. Precisaria fazer 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
          )
      )