检查资源预留可用性
Posted
技术标签:
【中文标题】检查资源预留可用性【英文标题】:Checking Resources Reservation Availability 【发布时间】:2014-11-30 12:31:48 【问题描述】:我有下表:
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:2014-10-06 07:00:00至2014-10-06之间预留车A 10:00:00 [有效] 客人#2:2014-10-06 07:00:00 之间预留车B 至 2014-10-06 10:00:00 [有效] 客人 #3:预留车厢 A 2014-10-06 08:00:00 至 2014-10-06 11:30:00 [不可用,由于开始 时间不可用] 客人 #4:2014-10-06 06:00:00 至 2014-10-06 之间预留车 B 14:00:00 [有效,但不应该是。由于客人 #2 已经 07:00:00 - 10:00:00 之间订车]。谁能帮助我如何改进我的代码,以便在请求的预订之间已经有预订时,最后一个条件将返回 False?
PS:我找到了这篇文章,但很难理解它,我正在寻找一种更简单的类似方法。 http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
编辑:
这张图片可视化了一切,我想现在我只需要实现每个列标题上指定的功能(那些有复选标记的人)。
【问题讨论】:
您只检查一个特定的时间点2014-10-06 07:00:00
,它介于2014-10-06 06:00:00
和2014-10-06 14:00:00
之间。所以一切正常。但是您必须检查计划预订的开始日期和结束日期。
@TiMESPLiNTER 我想我理解你的概念,我只是不知道该怎么做。我是否根据每小时范围检查了计划预订的开始和结束日期?
在下面查看我的答案。
【参考方案1】:
根据这个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 注入。
【讨论】:
谢谢!我会试一试。再次感谢您的建议,该变量已在查询之前进行了清理。 我对您的查询进行了测试,奇怪的是它返回: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 好吧,我打错了一些东西。现在检查 sqlfiddle。以上是关于检查资源预留可用性的主要内容,如果未能解决你的问题,请参考以下文章