5

同様のトピックについていくつか質問がありましたが、この特定の問題の解決策を見つけることができず、ご意見をいただければ幸いです。

私は、ユーザーが特定のサービスをオンラインで予約できる予約エンジンに取り組んでいます。特定の日(または週)内に利用可能なタイムスロットを見つけて表示することに固執しています。必要な時間枠の長さ(例:1時間)と時間帯を予約できる営業時間(例:09:00h〜18:00h)を知っています。さらに、既存の予定を格納するMySQLテーブルがあります。私の質問に関連する列は次のようになります。

id  start (datetime)        end (datetime)
1   '2012-11-16 13:00:00'   '2012-11-16 14:30:00'
2   '2012-11-16 15:00:00'   '2012-11-16 16:00:00'
3   '2012-11-17 12:00:00'   '2012-11-16 15:45:00'
4   '2012-11-17 13:00:00'   '2012-11-16 16:15:00'
...

上記の情報を考えると、利用可能なタイムスロットのリストを取得するための(MySQLまたはPHPでの)適切なソリューションを見つけることができません。もう1つの条件があります。タイムスロットは、四半期ごとのステップでのみ開始できます。つまり。上記の16番目の利用可能な1時間のタイムスロットのデータの例は
、09:00、09:15、09:30、09:45、10:00、...、12:00、16:00、16:です。 15、...、17:00。

(サンプルデータのように)重複する時間がある場合でも、使用可能なタイムスロットは重複できないことに注意してください。

これに取り組むための最良の方法は何だと思いますか?

4

1 に答える 1

8
SELECT a.end AS free_after
FROM bookings a
WHERE NOT EXISTS (
  SELECT 1
  FROM bookings b
  WHERE b.start BETWEEN a.end AND a.end + INTERVAL your_duration HOURS
)
AND a.end BETWEEN start_of_search_window AND end_of_search_window;

your_duration(整数)、start_of_search_window(日時)、および(日時) の値を指定するだけですend_of_search_window

そして、ベルとホイッスルが必要な場合....

SELECT free_from, free_until
FROM (
  SELECT a.end AS free_from,
  (SELECT MIN(c.start)
   FROM bookings c
   WHERE c.start > a.end) as free_until
  FROM bookings a
  WHERE NOT EXISTS (
    SELECT 1
    FROM bookings b
    WHERE b.start BETWEEN a.end AND a.end + INTERVAL your_duration HOUR
  )
  AND a.end BETWEEN start_of_search_window AND end_of_search_window
)
ORDER BY free_until-free_from
LIMIT 0,3;

ウィンドウ内で使用可能な最短の 3 つのスロット (つまり、ターゲット サイズに最も近い) が表示されます。

于 2012-11-16T14:22:52.757 に答える