Mysql
 sql >> база данни >  >> RDS >> Mysql

Изчисляване на общото количество оборудване за период от време

Започнах със следния SQL, за да събера всички периоди от време, които се пресичат с дадения диапазон:

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

Това е само първата част. След това трябва да изработите възможните припокривания; това не би било практично да се направи със SQL, така че бих предложил да направите това в PHP.

Общият алгоритъм, който бих избрал, за съжаление е O(n**2), той е така:

  • създайте времева линия (разграничена от всеки ден) с времето като хоризонтална ос
  • прегледайте всеки диапазон от дата/час и маркирайте времето на левия и десния му край, за да създадете времеви сегменти от всяка възможна пермутация.
  • с помощта на сегментите сумирате вертикално за припокривания и приемате дневния максимум напречно.

Надявам се това да помогне.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL INSERT - Имената на полетата изискват ли разграничаване с обратна отметка/акцент?

  2. MySQL - алтернативи на вложените подзаявки при ограничаване на обобщените данни в корелирана подзаявка

  3. Как да добавя JDBC драйвер към тръбопровода на Jenkins?

  4. php - конвертиране от един json формат в друг

  5. Как да задам избрания елемент в падащо меню