sql >> Base de Datos >  >> RDS >> Mysql

Cálculo de la cantidad total de equipos para un rango de fechas

Comencé con el siguiente SQL para recopilar todos los rangos de fechas que se cruzan con el rango dado:

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

Violín

Esta es solo la primera parte. A continuación, debe resolver las posibles superposiciones; esto no sería práctico de hacer con SQL, por lo que sugeriría hacerlo en PHP.

Desafortunadamente, el algoritmo genérico que elegiría es O(n**2), dice así:

  • cree una línea de tiempo (demarcada por cada día) con el tiempo como eje horizontal
  • itere sobre cada rango de fecha/hora y marque la hora de su borde izquierdo y derecho para crear segmentos de tiempo de cada permutación posible.
  • Usando los segmentos, sumas verticalmente para las superposiciones y obtienes el máximo diario transversal.

Espero que ayude.