|
|
|
|
|
для: Trianon
(08.05.2007 в 16:56)
| | Да... тут бы строгое сравнение было очень кстати:) | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 00:19)
| | Итак, контрпример, показывающий, что конструкцией BETWEEN пользоваться не получится.
имеющиеся записи
(1, '2007-05-08 15:00:00', '2007-05-08 16:00:00'),
(1, '2007-05-08 17:00:00', '2007-05-08 18:00:00')
|
Резервируемый интервал (сюрприз!)
('2007-05-08 16:00:00', '2007-05-08 17:00:00'),
|
| |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 16:24)
| | Теперь у меня подкопаться не получается.... придется смириться:) | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 15:59)
| | Посыпаю пеплом вешалку для кепки.
Исправлено.
<?$sql= "
SELECT servers.* FROM servers
LEFT JOIN (SELECT server_id from reservations
WHERE ($res_start>= res_start AND $res_start < res_stop)
OR ( res_start >= $res_start AND res_start < $res_stop)
) AS except ON servers.server_id = except.server_id
WHERE except.car_id IS NULL";
|
| |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 14:28)
| |
WHERE (0 AND 1)
OR ( 0 AND 1)
|
или я чего-то не понимаю? | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 14:24)
| | И что - результат другой?
По-моему - тот же самый. :) | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 13:47)
| |
res_start < $res_start < $res_stop < res_stop
|
это когда новый перекрывается старым, а старый новым это
$res_start < res_start < res_stop < $res_stop
|
| |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 11:41)
| | Вариант, когда существующий диапазон полностью перекрывается новым, это
res_start < $res_start < $res_stop < res_stop
|
Получаем:
SELECT server_id from reservations
WHERE (1 AND 1)
OR ( 1 AND 1)
|
Возвращает занятый server_id и NULL во внешнем селекте
SELECT servers.* FROM servers
LEFT JOIN (SELECT server_id ...) AS except ON servers.server_id = except.server_id
WHERE except.car_id IS NULL";
|
мы не получим
SELECT servers.* FROM servers .... WHERE 0;
|
ergo: Занятый ресурс нам не отдадут. | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 10:31)
| | Если я ничего не напутал, то твой вариант не отслеживает ситуацию, когда существующий диапазон полностью перекрывается новым. | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 00:37)
| |
<?$sql= "
SELECT servers.* FROM servers
LEFT JOIN (SELECT server_id from reservations
WHERE ($res_start>= res_start AND $res_start < res_stop)
OR ( res_stop >= $res_stop AND res_start < $res_stop)
) AS except ON servers.server_id = except.server_id
WHERE except.car_id IS NULL";
|
Вот этот оператор обеспечивает выборку свободных ресурсов, резервируемых интервалами времени. Если ты сможешь написать его компактнее через BETWEEN без нарушения логики - буду благодарен. | |
|
|
|
|