sql >> Database >  >> RDS >> Mysql

Totale hoeveelheid apparatuur berekenen voor een datumbereik

Ik begon met de volgende SQL om alle datumbereiken te verzamelen die het opgegeven bereik kruisen:

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

Dit is pas het eerste deel. Vervolgens moet je de mogelijke overlappingen uitwerken; dit zou niet praktisch zijn met SQL, dus ik raad aan om dit in PHP te doen.

Het generieke algoritme dat ik zou kiezen is helaas O(n**2), het gaat als volgt:

  • maak een tijdlijn (afgebakend door elke dag) met de tijd als horizontale as
  • herhaal elk datum-/tijdbereik en markeer de tijd van de linker- en rechterrand om tijdsegmenten van elke mogelijke permutatie te maken.
  • met behulp van de segmenten somt u verticaal op voor overlappingen en neemt u het dagelijkse maximum over.

Ik hoop dat dat helpt.




  1. Hoe gebruik je de WITH-clausule in MySQL?

  2. Zoek met VBA de versie van het MySQL ODBC-stuurprogramma dat in Windows is geïnstalleerd

  3. SQL CREATE TABLE … AS SELECT-instructie

  4. Een SQL Server-verbinding beperken tot een specifiek IP-adres