1

予約を管理するための最も適切な方法について少しアドバイスをいただければ幸いです。

MSSql DB を使用して VB で記述された既存のプログラムに追加しています。

現在、Win フォームを GUI として使用しており、DataGridView を使用して Month コントロールでデータを表示しています。

私の現在のDBスキーマは次のとおりです。

bikeDetail (bikeID (PK), bikeName, bikeColour, bikeStyle, bikeNotes)

bikeMovements (bikeMovementID (PK), bikeID, customerID, bikeMovementType, bikeMovementDate, bikeMovementAMPM, bikeMovementNotes).

customer (customerID, ..., ...)

自転車を出し入れするたびに、bikeMovements データベースに記録が作成されるという考え方です。これは、このデータを保存する最も簡単な方法ではないかもしれませんが、多くの繰り返しデータでデータベースが肥大化しないことを願っています。

私の問題は、自転車が入っているか出ていないかを確認するために bikeMovements テーブルを検索する最善の方法を見つけるのに苦労していることです。カレンダー ツールを使用して、日付の範囲を選択できます。

これまでのところ、SQL クエリを使用して特定の日付に自転車が利用可能かどうかを調べることができましたが、日付の範囲についてはできませんでした。

現在の SQL クエリ:

    SELECT * FROM tb_bikeMovements as bm, tb_bikeDetail as bd
    WHERE bm.bikeMovementDate < '" + startDate + "'
    and bm.bikeID = bd.bikeID
    and bm.bikeMovementType = 1 

これにより、その日以降に利用可能な自転車が返されます。(bikeMovementType 1 は戻ってきた自転車であるため、利用可能です)。

可用性を取り戻すためのより良いSQLクエリ、またはクエリをより簡単にするDBをセットアップするより良い方法についてアドバイスをいただければ幸いです。

日付の例:

自転車 1 は 4 月 22 日に出発し、4 月 24 日に予約されます (4 月 25 日から利用可能)
自転車 2 は 4 月 22 日に出発し、4 月 28 日に予約されます (4 月 29 日から利用可能)
自転車 3 は 26 日に出発します4 月、4 月 27 日に再度予約されます (4 月 28 日から
利用可能) バイク 4 は 4 月 22 日以降に利用可能です。

4 月 25 ~ 29 日に利用できる自転車は? (バイク 1 と 4 である必要があります。バイク 1 をキャッチするのは簡単です。バイク 3 は、選択した日付範囲内で出入りするため、軟膏のフライです!)。

最も簡単な方法は、DB スキーマを変更して、自転車が予約された日ごとにレコードが作成されるようにすることだと考えています。これにより、空室状況の検索がはるかに簡単になりますが、テーブルはより肥大化します (現在、レンタル中とレンタル中の自転車ごとに 2 つのレコード)。ただし、公平を期すために、これらの自転車が何日間レンタルされるかはまだわかりません。これは私の決定に影響を与える可能性があります.

どんなアドバイスもありがたく受け取られます!

4

1 に答える 1

1

私の理解が正しければ、必要な日付範囲内に移動記録 (アウトまたはイン) がある場合、自転車は利用できません (返却された翌日には利用可能です)。また、最後の移動記録がアウトの場合も利用できません。

クエリ

select distinct bikeid from bikemovements where bikeMovementDate between '25 April 2013' and '29 April 2013'

4月25日から29日の間に出入りした自転車を提供します

そのため、「not in」を使用して利用可能な自転車を見つけることで、これを無効にすることができます

select * from bikeDetail where bikeid not in (
  select distinct bikeid from bikemovements where bikeMovementDate between '25 April 2013' and '29 April 2013'
) 

しかし、自転車がすでに予約されていて、入っていないかどうかも確認する必要があると思います

これにより、各自転車の最後の移動日が取得されます(開始日まで)

  select bikeid bid, max(bikemovementdate) bmd from bikemovements
  where bikemovementdate < '25 April 2013' 
  group by bikeid) lastmove 

動きの記録を調べるために

select * from bikemovements join 
(
  select bikeid, max(bikemovementdate) bmd from bikemovements
  where bikemovementdate < '25 April 2013' 
  group by bikeid
) lastmove 
on lastmove.bikeid=bikemovements.bikeid and 
   lastmove.bmd=bikemovements.bikemovementdate

最後の動きが out のものだけを見つける

select bikemovements.bikeid from bikemovements join 
(
  select bikeid, max(bikemovementdate) bmd from bikemovements
  where bikemovementdate < '25 April 2013' 
  group by bikeid) lastmove 
on lastmove.bikeid=bikemovements.bikeid and 
   lastmove.bmd=bikemovements.bikemovementdate
where bikeMovementType = 'out'

すべてをまとめると、

select * from bikeDetail where bikeid not in (
select distinct bikeid from bikemovements 
  where bikeMovementDate between '25 April 2013' and '28 April 2013'
  ) 
and bikeid not in ( 

select bikemovements.bikeid from bikemovements join 
(
  select bikeid, max(bikemovementdate) bmd from bikemovements 
  where bikemovementdate < '25 April 2013' 
  group by bikeid
) lastmove 
 on lastmove.bikeid=bikemovements.bikeid and 
   lastmove.bmd=bikemovements.bikemovementdate
 where bikeMovementType = 'out'
)

SQLフィドル

于 2013-04-23T09:25:16.913 に答える