Даты бронирования диапазоны mysql php

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

См. SQLFiddle http://sqlfiddle.com/#!2/89b2b/2

У меня есть таблица бронирования, в которой есть ID, ObjectID, PeriodStart и PeriodEnd поля типа DATE в MySQL Мои данные примера выглядят следующим образом:

(1, 3, '2014-08-07', '2014-08-14'),
(2, 3, '2014-08-19', '2014-08-23'),
(3, 2, '2014-08-13', '2014-08-15'),
(4, 2, '2014-08-19', '2014-08-21');

Интервал дат моих запросов (обновлен, был $from = '2014-08-14';):

$from = '2014-08-15';
$to = '2014-08-19'

Я хотел бы получить ObjectID, которые свободны на интервал дат запроса. Проблема в том, что первая 2014-08-15 объекта 2 заканчивается на 2014-08-15 и мы хотим, чтобы новый заказ начался с 2014-08-15. То же самое с датой окончания 2014-08-19. Существующие оговорки начинаются в этот день. Это нормально для humans потому что мы вычисляем даты как nights, но как сказать то же самое в MySQL?

Для этих переменных

$from = '2014-08-15';
$to = '2014-08-19'

Я хотел бы получить [2, 3] в результате запроса.

Для второго запроса

$from = '2014-08-14';
$to = '2014-08-19'

Я бы хотел получить только [3] в результате запроса, потому что ObjectID 2 забронирован от 13 aug до 15 aug

4 ответа

Полный код:

SELECT DISTINCT ObjectID
FROM booking
WHERE ObjectID IN
(
SELECT ObjectID
FROM booking
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14'
)

#

+----------+
| OBJECTID |
+----------+
| 2 |
| 3 |
+----------+

Сценарий: http://sqlfiddle.com/#!2/89b2b/90


У вас просто ситуация, когда конечная дата не включена. Я бы сказал, что запрос:

select b.objectid
from booking b
group by b.objectid
having sum(b.PeriodStart < '2014-08-19' and B.PeriodEnd > '2014-08-14') = 0

Это подсчитывает количество раз, когда вы совершаете бронирование, который покрывает ночи, о которых вы заботитесь. Если они есть, объект отфильтровывается.


Это тоже кажется рабочим? я что-то пропустил

SELECT DISTINCT(ObjectID)
FROM booking
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14'


SELECT DISTINCT ObjectID FROM booking WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14';

http://sqlfiddle.com/#!2/89b2b/15

licensed under cc by-sa 3.0 with attribution.