检查资源预留可用性

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:002014-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

$datetimeStart2014-10-06 06:00:00$datetimeEnd2014-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。

以上是关于检查资源预留可用性的主要内容,如果未能解决你的问题,请参考以下文章

WSFC 主机资源预留

适用于 Elastic Beanstalk 的 AWS 预留实例和可用区

尽管有大量可用内存,但 malloc() 失败

REST 资源在 magento 中不可用

正在保存备份的磁盘没有足够的可用空间

无法在 Rails 中编写日期验证