2017-06-18 17 views
3

私は、ユーザが異なるサービス期間のサービスを予約することが可能でなければならない予約システムに取り組んでいます。MySQL - 利用可能なタイムスロットを見つけよう

予約済みのタイムテーブルを持つテーブルと空きタイムスロットを返すクエリがすでに格納されているMySQLテーブルがあります。

のように私のbookings表が見えます:場合

SELECT 
    a.datetime AS blockstart, 
    DATE_ADD(a.datetime, INTERVAL 599 SECOND) AS blockend 
FROM 
    datetimes a 
LEFT JOIN 
    (
     SELECT * 
     FROM bookings 
     WHERE point_id = 1 
    ) b ON 
     (a.datetime BETWEEN b.start AND b.end) 
     OR 
     (DATE_ADD(a.datetime, INTERVAL 599 SECOND) BETWEEN b.start AND b.end) 
WHERE b.id IS NULL AND a.datetime BETWEEN '2017-06-17 00:00:00' AND '2017-06-17 23:59:59'; 

:ここ

datetime (datetime) 
2017-06-17 14:40:00 
2017-06-17 14:50:00 
2017-06-17 15:00:00 
2017-06-17 15:10:00 
2017-06-17 15:20:00 
2017-06-17 15:30:00 
2017-06-17 15:40:00 
... 

がフリータイムスロットを返すクエリです:テーブルは10分間隔が含まれてい

point_id  start (datetime)  end (datetime) 
1   2017-06-17 14:50:00 2017-06-17 14:59:59 
1   2017-06-17 15:10:00 2017-06-17 15:19:59 
1   2017-06-17 15:40:00 2017-06-17 15:44:59 
2   2017-06-17 15:50:00 2017-06-17 16:04:59 
2   2017-06-17 16:05:00 2017-06-17 16:14:59 
... 

datetimesサービス期間は25分未満です - すべて正常です。 問題は25分を超えるサービスで発生します。私のクエリは、すでに予約されている10分のサービスと重複するスロットを返します。たとえば、13:00:00から13:09:59まで予約しています.1499秒の照会間隔では、12:50:00が返され、次の予約と重複します。 重複するサービスでこの問題を解決するのに手伝ってくれる人はいますか?

+0

[テーブルから忙しいavaliable mysqlのショータイムスロットとタイムスロット]の可能性のある重複( https://stackoverflow.com/questions/16459756/mysql-show-time-slots-avaliable-and-time-slots-busy-from-table) – Evert

+0

いいえ、あなたのリンクによる@Evertは、 11:00から14:20までですが、クエリでは10分間隔で空きが返され、この選択された時間にクライアントが記録されます。 – t0niq

答えて

1

あなたは、利用できないタイムスロットを見つけることができ、その後、使用可能なスロットを見つけるために日付時刻表と裏の参加:

SELECT distinct all_slots.`datetime` 
FROM datetimes AS all_slots 
LEFT JOIN (
    SELECT `datetime` 
    FROM datetimes AS d 
    JOIN bookings AS b 
    ON b.start BETWEEN d.`datetime` AND DATE_ADD(d.`datetime`, INTERVAL 599 SECOND) 
    OR b.end BETWEEN d.`datetime` AND DATE_ADD(d.`datetime`, INTERVAL 599 SECOND) 
) AS not_available 
ON all_slots.`datetime` = not_available.`datetime` 
WHERE not_available.`datetime` is null 
+0

@SIDUありがとう、それは私が必要なものです! – t0niq

関連する問題