检查重叠的汽车预订

时间:2010-11-27 20:24:02

标签: database date calendar

我正在为汽车租赁(学校作业)编写一个简单的预订程序。我和我的伙伴正在努力使系统比任务指令更先进,但我们希望你可以帮助我们解决一些问题。

这个想法是你可以保留某种车型,当你拿到车时,它将属于这种类型(你没有预留特定的车,因为我们的任务指示,但只有一种类型)。只有一位客户可以在特定日期开车。由于保留时间我们必须确保,我们不会雇用比我们更多的每种类型的汽车。预订基本上与开始日期,结束日期和汽车类型一起存储。

如果我们暂时忽略汽车类型(假设我们只有一种类型),那么预订可以用图形方式看起来像这样:

1/12  2/12  3/12  4/12  5/12  6/12  7/12
|-------------------|
                    |-----------------|
                                |-----|
|-------|
                          |-----------|
|-------------|

如果租车只有三辆车,可以从3月12日到5月12日租车,因为所有日子只有2辆车预订。但我们怎么知道呢?我们是否必须检查每个日期并计算()跨越该日期的预订数量?

如果有人在4月12日预订了一辆车,那么3月12日和5月12日仍然只有2个预订,但4/12会有3个。

是否可以对查询进行一些操作,或者我们是否必须逐步完成程序中的每个日期以检查预订数量是否超过汽车数量? (这很简单,只有完整的日期,但考虑你可以按小时租用汽车的情况(不仅是每天都在这里)。然后,如果我们有一个,那么它可能是一个可以逐步完成我们的很多预订和汽车和时间跨度很长......)

希望你有一些好的想法可以帮助我们。感谢您抽出宝贵时间阅读问题:)

  • 丹麦Mikkel

2 个答案:

答案 0 :(得分:1)

“是否可以对查询进行一些操作,或者我们是否必须逐步完成程序中的每个日期以检查预订数量是否超过汽车数量?(这很简单,只有完整的约会,“

您的问题的性质是违反约束可能会出现在任何个别日期。从逻辑上讲,确实有必要对新预订中包含的每个日期进行检查。唯一可能的优化是在“最小间隔”级别进行检查。要做到这一点,您必须首先计算已经出现在数据库中的所有间隔,并且与新预订重叠。

例如,4 / 12-6 / 12的新预订必须分为4 / 12-5 / 12(第二行)和5 / 12-6 / 12(第三行)。这些个别间隔可能超过一天,您可以检查这些间隔的级别。 (在这个特定的例子中,它们与个别日子相同,但7 / 12-19 / 12的保留根本不需要分开。

然而,计算这个可能会很困难,还有另一个警告:当你在寻找多行插入时,你也应该拆分要插入的其他行(这需要你记录所有插入的行)在临时表中,否则您将无法访问它们。)

答案 1 :(得分:1)

假设,你在现实生活中有这样的预约情况:

       1/12  2/12  3/12  4/12  5/12  6/12  7/12
Car1:  |-------------------|
Car2:                      |-----------------|
Car3:  |-------|     |-----------|     |-----|                              
Car4:  |-------------|

car

| id | type | registration |
| 1  | 1    | HH1111       |
| 2  | 1    | HH3333       |
| 3  | 2    | HH77         |
| 4  | 3    | DD999        |

reservation

| car_id | date_from  | date_to    |
| 1      | 2013-12-01 | 2013-12-04 |
| 2      | 2013-12-04 | 2013-12-07 |
| 3      | 2013-12-01 | 2013-12-02 |
| 3      | 2013-12-03 | 2013-12-05 |
| 3      | 2013-12-06 | 2013-12-07 |
| 4      | 2013-12-01 | 2013-12-03 |

现在,您必须通过非常简单的逻辑,选择所有可用的汽车

2013-12-052013-12-06

“选择所有没有任何日期预订的车辆,阻止其使用” 用brillian mysql选择:

select * from car  where not exists ( select * from reservation 
where car.id = reservation.car_id AND
date_from < '2013-12-06' AND
date_to > '2013-12-05' )