Как лучше всего проверить, доступна ли [длительность] с рядами резервирований? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть следующие столбцы таблицы SQL:

reservationId - int
startDateTime - datetime
endDateTime - datetime

Моя проблема заключается в следующем:

Я хочу посмотреть, есть ли период [времени] надень, когда я смогу забронировать [время].

Например, я ищу 2-часовое бронирование 1-го июня с 9:00 до 21:00. * 10101 *

1 июня в настоящее время есть два бронирования:

10am - 2pm
4pm - 6pm

Я бы хотел, чтобы мой запрос возвращал время, доступное для бронирования.Т.е.:

2pm - 4pm
6pm - 8pm
7pm - 9pm

Есть идеи, как это сделать?

1 Ответ

0 голосов
/ 26 апреля 2019

Это не полный ответ, но он поможет вам на полпути:

SELECT o.openingStart, IFNULL(o.openingEnd, '2019-04-26 21:00:00') AS openingEnd
FROM (
    SELECT r.endDateTime AS openingStart
        , (SELECT r2.startDateTime 
           FROM reservations AS r2 
           WHERE r2.startDateTime > r.endDateTime
               AND r2.endDateTime < '2019-04-27 00:00:00'
           ORDER BY r2.startDateTime ASC
           LIMIT 1
        ) AS openingEnd
    FROM ( SELECT startDateTime, endDateTime 
           FROM reservations 
           WHERE startDateTime >= '2019-04-26 00:00:00' 
             AND endDateTime < '2019-04-27 00:00:00'
           UNION
           SELECT '2019-04-26 00:00:00', '2019-04-26 09:00:00'
         ) AS r
) AS o

После этого вы захотите отфильтровать только по отверстиям два часа или дольше, а затем, возможно, потребуется присоединиться к некоторой статической таблице часов, чтобы расширить большие отверстия в меньшие, которые они могут вместить.

IFNULL на самом деле может использоваться во внутреннем запросе, но я подумал, что это может быть немного понятнее.

Примечание. Все литеральные значения даты и времени должны быть заменены на соответствующие значения параметров.

...