Помощь с составлением SQL-запроса
2 000 руб. за проект
•
наличный расчёт, электронные деньги
Нужна помощь с составлением sql-запроса.
Есть система записи клиентов на услуги на определенное время и в определенный бокс.
Есть таблица бронирований (bookings) вида:
point_id start (datetime) end (datetime)
1 2017-07-06 16:40:00 2017-07-06 16:44:59
1 2017-07-06 20:00:00 2017-07-06 21:04:59
1 2017-07-06 09:30:00 2017-07-06 10:34:59
2 2017-07-05 17:30:00 2017-07-05 17:34:59
2 2017-07-05 09:00:00 2017-07-05 09:14:59
...
Таблица интерваллов (datetimes):
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
...
И запрос, который возвращает свободные интервалы, в зависимости от продолжительности услуги (в данном случае 599 секунд для 10 минутной услуги):
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
) AND point_id = 1
) AS not_available
ON
all_slots.`datetime` = not_available.`datetime`
WHERE
not_available.`datetime` IS NULL AND all_slots.`datetime` BETWEEN '2017-07-06 09:00:00' AND '2017-07-07 21:00:00'
Проблема в том, что если есть запись, например, с 20:00 до 21:05, при запросе свободных интервалов в 599 секунд, текущий запрос выдает вместе со свободными еще и 20:10, 20:20, 20:30.
При меньшей длительности услуги все ок, занятое время не выдает.
Есть система записи клиентов на услуги на определенное время и в определенный бокс.
Есть таблица бронирований (bookings) вида:
point_id start (datetime) end (datetime)
1 2017-07-06 16:40:00 2017-07-06 16:44:59
1 2017-07-06 20:00:00 2017-07-06 21:04:59
1 2017-07-06 09:30:00 2017-07-06 10:34:59
2 2017-07-05 17:30:00 2017-07-05 17:34:59
2 2017-07-05 09:00:00 2017-07-05 09:14:59
...
Таблица интерваллов (datetimes):
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
...
И запрос, который возвращает свободные интервалы, в зависимости от продолжительности услуги (в данном случае 599 секунд для 10 минутной услуги):
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
) AND point_id = 1
) AS not_available
ON
all_slots.`datetime` = not_available.`datetime`
WHERE
not_available.`datetime` IS NULL AND all_slots.`datetime` BETWEEN '2017-07-06 09:00:00' AND '2017-07-07 21:00:00'
Проблема в том, что если есть запись, например, с 20:00 до 21:05, при запросе свободных интервалов в 599 секунд, текущий запрос выдает вместе со свободными еще и 20:10, 20:20, 20:30.
При меньшей длительности услуги все ок, занятое время не выдает.
В заказе есть исполнитель
При переводе заказа из архивного в актуальный, текущий исполнитель будет снят с задачи.
Выберите тип сделки
С безопасной сделкой вы всегда сможете вернуть средства, если что-то пойдет не так. С простой сделкой вы самостоятельно договариваетесь с исполнителем об оплате и берете на себя решение конфликтов.