我有下表:
id | rsvp_date | return_date | user_id | car_id
其中ID是PK,rsvp_date& return_date是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个字段;开始日期和返回日期)。
当前代码无法正常工作。例如:
任何人都可以帮助我如何改进我的代码,以便在所请求的预订之间已经预订时,最后一个条件将返回False吗?
PS:我发现这篇文章但很难理解它,我正在寻找类似的方法,只是更简单。 http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET编辑:
这张图片可视化一切,我想现在我只需要实现每个列标题上指定的功能(带有复选标记的那些)。
答案 0 :(得分:2)
根据这个SO question,您必须检查不同的内容:
$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注入。