2010-11-27 15 views
3

私はレンタカーのための簡単な予約プログラム(学校の割り当て)を書いています。私と私の仲間は、システムが割り当ての指示よりも少し進んでいるようにしようとしていますが、私たちがあなたを助けてくれることを望んでいます。車の重複を確認する

アイデアは、特定の車種を予約することができるということです。車を取得すると、そのタイプのものになります(割り当ての指示に従って、特定の車を予約するのではなくタイプのみを予約します)。特定の日付に車を所有できるのは1人の顧客だけです。予約の目安としては、我々は我々が持っているよりもそれぞれのタイプのより多くの車を雇用していないことを確認する必要があります。予約は、基本的に開始日、終了日、車の種類で保存されます。レンタルは3台のだけの車を持っている場合

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

はそれが可能になります:私たちは今の車のタイプを無視した場合

その後、予約がグラフィカルにこのような何かを見ることができる(私たちは一種類のみを持って言うことができます)すべての日に2台の車の予約があるため、3/12〜5/12の間にレンタカーをご利用ください。しかし、これをどうやって知っていますか?各日付をチェックし、その日付にまたがる予約の数をカウントする必要がありますか?

そして、何誰かが4/12に車を予約していた場合、その後、3月12日と5月12日はまだわずか2つの予約を持っているだろうが、4月12日には3

を持つことになり、それを行うことが可能であろうクエリのいくつかの方法で、または我々は予約の数を確認するためにプログラムの各日付をステップアップする必要があります車の数を超えていないのですか? (これは完全な日付では簡単ですが、1時間単位で車を借りることができるシナリオを考慮してください(毎日だけでなく、各自の車を借りることもできます)。多くの予約と車とタイムスパンは長いです...)

私たちに役立ついくつかの素晴らしいアイデアがありますように。質問を読むために時間を割いていただきありがとうございます:)

  • ミッケル、デンマーク
+1

の可能な複製を、[かどうか二つを決定日付範囲が重なり合う](0120-18753) –

+0

2つの日付範囲が重複しているかどうかを単純に判断するよりもかなり複雑です。 –

答えて

1

「いくつかの方法、または私たちは、各日付をステップ実行しなければならないのクエリを行うことも可能であろうプログラムの予約数が車の数を超えていないことを確認してください(完全な日付では簡単です)。

問題の性質は、個々の日付に制約の違反が現れる可能性があるということです。論理的に言えば、実際には、新しい予約に含まれる個々の日付ごとにチェックを行う必要があります。可能なタイミングは、「最小間隔」のレベルでチェックを行うことです。これを行うには、データベースにすでに表示されている、新しい予約と重複するすべての間隔を最初に計算する必要があります。

たとえば、4/12-6/12の新しい予約は、4/12-5/12(2行目)と5/12-6/12(3行目)に分割する必要があります。これらの個別の間隔は1日より長くなる場合があり、個々の間隔のレベルをチェックすることができます。 (この特定の例では個々の日と同じですが、予約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-05から

選択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') 
関連する問題