2013-09-21 2 views
0

Я пытаюсь найти свободные временные интервалы между 2-мя днями времени, которые соответствуют определенной продолжительности для системы бронирования, но я застрял на правильном запросе.Mysql Найти бесплатное время (слоты) между встречами для системы бронирования

моего дБ Событие:


+----------+---------------------+---------------------+---------+ 
| Event_ID | StartTime   | EndTime    | Pers_ID | 
+----------+---------------------+---------------------+---------+ 
|  3 | 2013-09-21 16:00:00 | 2013-09-21 16:30:00 |  6 | 
|  21 | 2013-09-21 09:00:00 | 2013-09-21 09:15:00 |  6 | 
|  5 | 2013-09-21 09:15:00 | 2013-09-21 10:15:00 |  6 | 
|  64 | 2013-09-21 15:00:00 | 2013-09-21 15:45:00 |  6 | 
|  32 | 2013-09-21 10:15:00 | 2013-09-21 11:30:00 |  6 | 
|  6 | 2013-09-21 13:00:00 | 2013-09-21 14:45:00 |  6 | 
+----------+---------------------+---------------------+---------+ 

Результат должен быть свободными возможными интервалами 75 минут с Pers_ID = 6 между 2013-09-21 9:00:00 И 2013-09-21 22:00 : 00, а также они должны начать сразу после EndTime уже в базе

Уже спасибо за помощь,
E-RASER

+0

Сколько записей содержится в таблице? –

+0

Привет Раймонд, + - 5000 записей и около 20 receords в день Br, E-Raser –

ответ

0
SELECT AvailStartTime, AvailEndTime 
FROM (
    SELECT @lastEndTime as AvailStartTime, StartTime as AvailEndTime, @lastEndTime := EndTime 
    FROM (SELECT StartTime, EndTime 
      FROM Events 
      WHERE Pers_ID = 6 
      AND EndTime >= '2013-09-21 09:00' 
      AND StartTime < '2013-09-21 22:00' 
      ORDER BY StartTime) e 
    JOIN (SELECT @lastEndTime := NULL) init) x 
WHERE AvailEndTime > DATE_ADD(AvailStartTime, INTERVAL 75 MINUTE) 

DEMO

+0

@ E-Raser PRIMARY KEY (event_id), KEY (Pers_ID, время_запуска, EndTime) вам нужны эти показатели, так это требуется два полных сканирования таблиц вместо трех, но это все еще не очень хорошо, если ваши таблицы большие –

+0

Привет @Barmar, спасибо за вашу помощь, но в этом примере все еще что-то не так (http://sqlfiddle.com/# ! 2/d743c/18) Я ищу временные интервалы в 30 минут, должны быть следующие слоты: начиная с 9: 15, начиная с 11:30, а также с последнего, начиная с 16:30, но этот последний пропал, отсутствует. –

+0

Он может найти слоты между двумя событиями, поскольку он сравнивает каждую строку с соседней, чтобы увидеть, есть ли место. Он не найдет слоты после последнего события или перед первым, так как сравнивать нечего. – Barmar

Смежные вопросы