sql >> Databáze >  >> RDS >> Mysql

MySQL rozdělené podle časového rozsahu

Potřebujete rowsource se všemi časy, které chcete vrátit. Poté můžete pomocí operace JOIN vybrat řádky, které mají být vráceny.

Pokud byste měli takový stůl:

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

Pak byste to mohli použít ve svém dotazu:

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

Pokud chcete časové hodnoty ve specifickém formátu, můžete použít DATE_FORMAT funkce:

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

To předpokládá, že hodnoty vrácené zobrazením jsou TIME datový typ. Pokud nejsou, budete je chtít převést. (Nebo můžete získat stejný výsledek při práci se znakovými řetězci v kanonickém formátu.)

POZNÁMKA:Není povinné mít stůl; může to být libovolný zdroj řádků, například vložený pohled. Potřebujete jen dostatek řádků (ve vašem případě, za předpokladu půlhodinových přírůstků od 00:00 do 23:30, to je 48 řádků.)

Pokud máte nějaké časové rozsahy, které „překračují“ půlnoční hranici (např. 22:00 až 02:00), ukázkový dotaz nevrátí žádné řádky. Budete muset provést úpravy.

Něco jako:

 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. PHP PDO pouze poslední hodnota pole se vloží pomocí bindValue &bindParam

  2. PostgreSQL parametrizované Order By / Limit v tabulkové funkci

  3. Adresa objednávky SQL podle čísla domu

  4. PDOStatement::execute() vrací true, ale data se neaktualizují