sql >> Databasteknik >  >> RDS >> Mysql

Beräknar den totala mängden utrustning för ett datumintervall

Jag började med följande SQL för att samla alla datumintervall som skär det givna intervallet:

SELECT MAX(available) - IFNULL(SUM(amountInSch), 0)
FROM Table1
LEFT JOIN Table3 USING (eqid)
LEFT JOIN Table2 USING (scheduleid)
WHERE DATE(startDate) <= '2012-08-27' AND DATE(endDate) >= '2012-08-27'
  AND endTime > '08:30' AND startTime < '12:00'
  AND eqid = 1

Fiol

Detta är bara den första delen. Härnäst måste du räkna ut möjliga överlappningar; detta skulle inte vara praktiskt att göra med SQL, så jag skulle föreslå att du gör detta i PHP.

Den generiska algoritmen jag skulle välja är tyvärr O(n**2), den ser ut så här:

  • skapa en tidslinje (avgränsad av varje dag) med tiden som horisontell axel
  • itera över varje datum-/tidsintervall och markera tiden för dess vänstra och högra kant för att skapa tidssegment av alla möjliga permutationer.
  • när du använder segmenten summerar du vertikalt för överlappningar och tar det dagliga maxvärdet över.

Hoppas det hjälper.




  1. Ansluta till en online MySQL-databas med VB.Net

  2. Jämför MariaDB Server med MariaDB Cluster

  3. Bevara radavbrott från TextArea när du skriver till MySQL

  4. Kan jag få WHERE col LIKE '%' att välja NULL-värden också?