|
|
|
| Здравствуйте. Занимаюсь сайтом конторы, которая сдает напрокат автомобили. Заказ попадает в таблицу заказов, где есть поля date_from (дата начала проката) и date_to (окончание проката). Как выбрать автомобили, которые не забронированы в указанный промежуток времени ($srch_date_from и $srch_date_to)? У меня получился такой запрос:
SELECT *
FROM ap_autos
WHERE id_auto NOT IN (SELECT id_auto
FROM ap_orders
WHERE (
({$srch_date_from} >= date_from AND {$srch_date_to} <= date_to) OR
({$srch_date_from} <= date_from AND {$srch_date_to} BETWEEN date_from AND date_to) OR
({$srch_date_from} BETWEEN date_from AND date_to AND {$srch_date_to} >= date_to) OR
(date_from >= {$srch_date_from} AND date_to <= {$srch_date_to})";
))
|
Учтены ситуации, когда:
1. Временной отрезок промежутка полностью входит в отрезок заказа
2. Конечная точка промежутка попадает на заказ.
3. Начальная точка промежутка попадает на заказ.
4. Отрезок заказа полностью входит в отрезок промежутка.
Запрос правильный? | |
|
|
|
|
|
|
|
для: antf
(17.08.2012 в 18:13)
| | Автомобили, которые выпадают из списка, т.е. время их заказа хоть как-то пересекается с требуемым (немного укорочу условия):
SELECT DISTINCT id_auto
FROM ap_orders
WHERE date_from BETWEEN {$srch_date_from} AND {$srch_date_to}
OR date_to BETWEEN {$srch_date_from} AND {$srch_date_to}
OR (date_from <= {$srch_date_from} AND date_to >= {$srch_date_to})
|
А так - да, вроде верно. | |
|
|
|
|
|
|
|
для: Sfinks
(17.08.2012 в 22:35)
| | >А так - да, вроде верно.
Небольшое дополнение. Допустим, я оформляю заказ на период с 21:00 по 22:00 (date_from = 2012-08-25 21:00, date_to = 2012-08-25 22:00), а потом оформляю второй заказ с 22:00 по 23:00 (date_from = 2012-08-25 22:00, date_to = 2012-08-25 23:00). В этом случае мне пишут, что автомобиль занят, по запросу находится первый заказ. Я не стал менять логику запроса и решил проблему на уровне php:
<?php
$date_from = date("Y-m-d H:i", strtotime($date_from) + 60); //22:01
$date_to = date("Y-m-d H:i", strtotime($date_to) - 60); //22:59
?>
|
| |
|
|
|
|
|
|
|
для: antf
(25.08.2012 в 20:49)
| | А авто освободившееся в 22:00 не надо помыть, пропылесосить, привезти в порядок?
Если нет, то можно просто сделать строгое неравенство.
Вместо
WHERE date_from BETWEEN {$srch_date_from} AND {$srch_date_to} OR ......
|
написать:
WHERE (date_from > {$srch_date_from} AND date_from < {$srch_date_to}) OR .......
|
А если это нужно учесть и на это, например, нужно 15 минут, то можно исправить так:
WHERE date_from BETWEEN {$srch_date_from} -INTERVAL 15 MINUTE AND {$srch_date_to} +INTERVAL 15 MINUTE OR ......
| , только где +INTERVAL, а где -INTERVAL сами сообразите, а то долго вникать. | |
|
|
|