2014-10-06 55 views
1

我有以下表:检查资源预留可用性

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场开始日期和返回日期)

当前的代码不工作,我希望它是例如:

  • 旅客#1:预留车载A 7点00分00秒为2014年10月6日之间2014年10月6日10:00:00 [有效]
  • 旅客#2:预留汽车2014-之间乙10-06 07:00:00 去2014-10-06 10:00:00 [有效期]
  • 客人#3:预约车A在 2014-10-06 08:00:00到2014-10- 06 11:30:00 [不可用,由于开始 时间不可用]
  • Guest#4:在2014-10-06 06:00:00之间预约车B到2014-10-06 14:00: 00 [有效,但不是假设。由于Guest#2已经在07:00:00 - 10:00:00之间预订了 ]。

任何人都可以帮助我改进我的代码,当最后一个条件在预订时间之后已经有预订时会返回False吗?我发现这篇文章,但有一个困难的理解,我正在寻找一个类似的方法只是简单的。 http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

编辑:

这张照片想象的一切,我想现在我只需要在每个列标题,如为实现一个函数(那些谁都有复选标记)。

enter image description here

+0

您只能检查一个特定时间点“2014-10-06 07:00:00”,这是在“2014-10-06 06:00:00”和“2014-10-06 14:00:00之间'。所以一切正常。但是您必须检查计划预订的开始日期和结束日期。 – TiMESPLiNTER 2014-10-06 09:25:01

+0

@TiMESPLiNTER我想我理解你的概念,我只是不知道该怎么做。我是否已针对每个小时范围检查计划预订的开始日期和结束日期? – Jeremy 2014-10-06 09:29:59

+0

请参阅下面的答案。 – TiMESPLiNTER 2014-10-06 09:45:43

回答

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

哪里$datetimeStart2014-10-06 06:00:00$datetimeEnd2014-10-06 14:00:00为您Guest #4测试情况的。

如果您使用可能包含用户输入的变量来协调SQL查询,请注意SQL注入。

+0

谢谢!我会试一试。并再次感谢您的建议,变量在查询之前已经过清理。 – Jeremy 2014-10-06 09:47:21

+0

我运行测试你的查询,奇怪的是它返回这个:9,2014-10-15 07:00:00,2014-10-15 17:00:00,1,5 and this 10,2014-10-07 07:00:00,2014-10-07 09:00:00,1,5 – Jeremy 2014-10-06 10:14:48

+0

这很奇怪。你可以做一个SQLfiddle吗? http://sqlfiddle.com/ – TiMESPLiNTER 2014-10-06 10:24:50