Mysql
 sql >> Base de données >  >> RDS >> Mysql

Calcul de la quantité totale d'équipements pour une plage de dates

J'ai commencé avec le SQL suivant pour rassembler toutes les plages de dates qui se croisent avec la plage donnée :

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

Violon

Ceci n'est que la première partie. Ensuite, vous devez déterminer les chevauchements possibles ; ce ne serait pas pratique à faire avec SQL, donc je suggérerais de le faire en PHP.

L'algorithme générique que je choisirais est malheureusement O(n**2), il se présente ainsi :

  • créer une chronologie (délimitée par chaque jour) avec le temps comme axe horizontal
  • itérer sur chaque plage de dates/heures et marquer l'heure de ses bords gauche et droit pour créer des segments temporels de toutes les permutations possibles.
  • à l'aide des segments, vous additionnez verticalement les chevauchements et vous prenez le maximum quotidien.

J'espère que ça aide.