у меня есть следующая таблица:
id | rsvp_date | return_date | user_id | car_id
где ID — это PK, rsvp_date & return_date is DATETIME, user_id & car_id — это FK для таблицы пользователей и таблицы машин соответственно.
Что я хочу сделать, это проверять каждый раз, когда пользователь хотел бы сделать заказ. Запрос, который проверяет, что сводится к этому (этот запрос вызывается функцией checkAvailability ():
SELECT id
FROM `car_reservation`
WHERE ('2014-10-06 07:00:00' BETWEEN rsvp_date AND return_date)
AND car_id = 5;
Функция, которую я упомянул:
function checkAvailability($datetime, $id = null){
$sql = "SELECT id
FROM `car_reservation`
WHERE ('".$datetime."' BETWEEN rsvp_date AND return_date)
AND car_id = ".$id;
$query = $this->db->query($sql);
// echo "<pre>"; print_r($this->db->last_query());die();
if($query->num_rows() > 0){
return FALSE;
}else{
return TRUE;
}
}
Где указанная дата будет сопоставлена со столбцами rsvp_date и return_date. А дата берется из поля формы (есть 2 поля; Дата начала и Дата возврата).
Текущий код не работает так, как я хочу. Например:
Может ли кто-нибудь помочь мне с тем, как мне улучшить свой код, чтобы последнее условие вернулось «Ложь», если между запрошенным бронированием уже сделано бронирование?
PS: я нашел эту статью, но с трудом понимая ее, я ищу подобный подход только проще. http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
РЕДАКТИРОВАТЬ:
Эта картина визуализирует все, я думаю, теперь мне просто нужно реализовать функцию, указанную в заголовке каждого столбца (те, у кого есть галочка).
Согласно этому ТАК вопрос Вы должны проверить разные:
$query = "SELECT id
FROM `car_reservation`
WHERE (
'".$datetimeStart."' <= return_date
AND
'".$datetimeEnd."' >= rsvp_date
) AND car_id = ".$id
";
Смотрите SQL скрипку: http://sqlfiddle.com/#!2/d818c/1
куда $datetimeStart
является 2014-10-06 06:00:00
а также $datetimeEnd
является 2014-10-06 14:00:00
по вашему Guest #4
сценарий теста.
И помните о SQL-инъекциях, если вы объединяете SQL-запрос с переменными, которые могут содержать пользовательский ввод.
Других решений пока нет …