Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Berechnen der Gesamtmenge der Ausrüstungen für einen Datumsbereich

Ich habe mit dem folgenden SQL begonnen, um alle Datumsbereiche zu sammeln, die sich mit dem angegebenen Bereich schneiden:

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

Fiddle

Dies ist nur der erste Teil. Als nächstes müssen Sie die möglichen Überschneidungen ausarbeiten; Dies wäre mit SQL nicht praktikabel, daher würde ich vorschlagen, dies in PHP zu tun.

Der generische Algorithmus, den ich wählen würde, ist leider O(n**2), er geht so:

  • Erstellen Sie eine Zeitachse (durch jeden Tag abgegrenzt) mit der Zeit als horizontale Achse
  • Iterieren Sie über jeden Datums-/Zeitbereich und markieren Sie die Zeit seines linken und rechten Rands, um Zeitsegmente jeder möglichen Permutation zu erstellen.
  • unter Verwendung der Segmente summieren Sie vertikal für Überschneidungen und nehmen das Tagesmaximum quer.

Hoffe das hilft.