sql >> Database >  >> RDS >> Mysql

MySQL opgesplitst op tijdbereik

Je hebt een rowsource nodig met alle tijden die je wilt retourneren. Vervolgens kunt u een JOIN-bewerking gebruiken om de rijen te selecteren die moeten worden geretourneerd.

Als je een tabel als deze had:

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

Dan zou je dat in je vraag kunnen gebruiken:

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

Als u de tijdwaarden in een specifiek formaat wilt, kunt u de DATE_FORMAT . gebruiken functie:

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

Dit veronderstelt dat de waarden die door de weergave worden geretourneerd TIME zijn data type. Als dat niet het geval is, wilt u ze converteren. (Of je zou hetzelfde resultaat kunnen krijgen door te werken met tekenreeksen in een canoniek formaat.)

OPMERKING:het is niet verplicht dat u een tafel heeft; het kan elke rijbron zijn, zoals een inline-weergave. Je hebt gewoon genoeg rijen nodig (in jouw geval, uitgaande van stappen van een half uur van 00:00 tot 23:30, dat zijn 48 rijen.)

Als u tijdbereiken heeft die een middernachtgrens 'overschrijden' (bijv. 22:00 tot 02:00 uur), retourneert de voorbeeldquery geen rijen. U moet aanpassingen maken.

Iets als:

 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. Is het mogelijk om een ​​subquery te doen met Sequelize.js?

  2. Subsidies opvragen voor een tabel in postgres

  3. Hoe installeer ik Postgis op een Keg-installatie van [email protected] met Homebrew?

  4. Hoe dubbele berekening in SQL te elimineren?