Mysql
 sql >> Database >  >> RDS >> Mysql

Calcolo della quantità totale di apparecchiature per un intervallo di date

Ho iniziato con il seguente SQL per raccogliere tutti gli intervalli di date che si intersecano con l'intervallo specificato:

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

Questa è solo la prima parte. Successivamente devi elaborare le possibili sovrapposizioni; questo non sarebbe pratico da fare con SQL, quindi suggerirei di farlo in PHP.

L'algoritmo generico che sceglierei è sfortunatamente O(n**2), funziona così:

  • crea una sequenza temporale (demarcata da ogni giorno) con l'ora come asse orizzontale
  • Esegui l'iterazione su ogni intervallo di data/ora e segna l'ora del bordo sinistro e destro per creare segmenti temporali di ogni possibile permutazione.
  • utilizzando i segmenti, sommi verticalmente per le sovrapposizioni e prendi il massimo giornaliero.

Spero di esserti stato d'aiuto.