Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как выбрать автомобили, которые не забронированы в указанный промежуток времени ?
 
 автор: antf   (17.08.2012 в 18:13)   письмо автору
 
 

Здравствуйте. Занимаюсь сайтом конторы, которая сдает напрокат автомобили. Заказ попадает в таблицу заказов, где есть поля 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. Отрезок заказа полностью входит в отрезок промежутка.

Запрос правильный?

  Ответить  
 
 автор: Sfinks   (17.08.2012 в 22:35)   письмо автору
 
   для: 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})

А так - да, вроде верно.

  Ответить  
 
 автор: antf   (25.08.2012 в 20:49)   письмо автору
 
   для: 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
?>

  Ответить  
 
 автор: Sfinks   (26.08.2012 в 14:40)   письмо автору
 
   для: 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 сами сообразите, а то долго вникать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования