次の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
これは最初の部分にすぎません。次に、考えられる重複を解決する必要があります。これはSQLで行うのは実用的ではないため、PHPで行うことをお勧めします。
残念ながら、私が選択する一般的なアルゴリズムはO(n ** 2)であり、次のようになります。
- 時間を横軸としてタイムライン(日ごとに区切る)を作成します
- すべての日付/時間範囲を繰り返し、その左端と右端の時間をマークして、考えられるすべての順列の時間セグメントを作成します。
- セグメントを使用して、オーバーラップを垂直方向に合計し、1日あたりの最大値を取得します。
お役に立てば幸いです。