2010-11-27 50 views
3

我正在写一个简单的汽车租赁(学校任务)预订程序。我和我的好友正试图让这个系统比分配任务更先进一些,但我们遇到了一些问题,我们希望您能帮助我们。检查重叠的汽车保留

这个想法是,你可以保留一定的汽车类型,当你得到汽车时,它会是这种类型的汽车之一(你不会保留特定的汽车,因为我们的任务规定,但只有一种类型)。只有一位顾客可以在特定的日期安排车辆。由于我们必须确保保留的预订,我们不会租用每种类型的汽车,而不是我们所拥有的。预订基本上存储有开始日期,结束日期和汽车类型。

如果我们忽略了现在的汽车类型(可以说我们只有一种类型),则保留可以以图形看起来像这样:

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,丹麦
+1

的可能重复[确定是否两日期范围重叠](http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap) – 2010-11-27 20:46:09

回答

1

“有没有可能与查询做一些怎么样,还是我们必须步步在每个日期检查预订数量没有超过车辆数量的程序?(这很容易,只有完整的日期,“

你的问题的性质是违反约束可能出现在任何单独的日期。因此从逻辑上说,确实需要对新预订中包含的每个单独日期进行检查可能的调整是在“最小间隔”级别进行检查。要做到这一点,您必须首先计算已经出现在数据库中的所有时间间隔,以及与新预订重叠的时间间隔。例如,4/12-6/12的新预订必须分成4/12-5/12(第二行)和5/12-6/12(第三行)。这些单独的时间间隔可能会超过一天,您可以在这些时间间隔内进行检查。 (在这个例子中,它们与单独的日子相同,但是保留7/12-19/12根本不需要分割。

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

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')