2011-04-10 6 views
0

私は、特定の日数(checkin_dateとcheckout_date)でどのヴィラが無料であるかを調べるための簡単なクエリを作成しました。TSQLクエリヘルプ結合関数

しかし、今、私はそれについて考えることを私は以下のクエリが正しい結果を返すとは思わない:

SELECT DISTINCT default_villa_type 
FROM villa, reservation 
WHERE villa.villa_type = reservation.default_villa_type 
and res_checkin_date not between '2011-12-21' and '2011-12-23' 
and res_checkout_date not between '2011-12-21' and '2011-12-23' 

私が使用するクエリが必要になります。

次の列を持つヴィラテーブル:

(villa_id, phone_ext, villa_type, no_of_rooms, no_of_beds, default_price_plan) 

次の列と予約テーブル:

(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, default_villa_type, price_plan) 

両方のテーブルを使用して、クエリに入力された日付の下で利用可能なヴィラの種類を判断するのは適切ではないとは思いますが、間違っている可能性があります。 。

+0

予約のチェックインが指定された範囲の開始日より前で、そのチェックアウト日が範囲の終了日より後であった場合、コードが破損する可能性があります。したがって、ヴィラの予約が2011年12月20日から2011年12月24日までの場合、そのヴィラは無料ではありませんが、コードは無料で返却されます。 – bitxwise

+0

テーブル 'reservation'にも' villa_id'フィールドはありませんか?どのヴィラが予約されたのか、どうやって知っていますか? –

+0

これはまだ開いているのですか、あなたの質問に答えられましたか? – bitxwise

答えて

2

無料のヴィラを表すレコードがなく、無料ではないヴィラを表すレコードのみがないので、最初は無料ではないすべてのヴィラを見つけることができます。

SELECT villa_id 
FROM villa 
WHERE villa_type NOT IN (
    SELECT default_villa_type 
    FROM reservation 
      --reservations starting within range 
    WHERE res_checkin_date > '2011-12-21' 
      AND res_checkin_date < '2011-12-23' 

      --reservations starting before range and ending after range 
      OR (
       res_checkin_date <= '2011-12-21' 
       AND res_checkout_date > '2011-12-21' 
      ) 

      --reservations ending within range 
      OR (
       res_checkout_date > '2011-12-21' 
       AND res_checkout_date < '2011-12-23' 
      ) 
) 

もう一つの方法は、ミカエルさんのコメントごとに、使用できます

SELECT villa_id 
FROM villa 
WHERE villa_type NOT IN (
    SELECT default_villa_type 
    FROM reservation 
    WHERE res_checkin_date < '2011-12-23' 
      AND res_checkout_date > '2011-12-21' 
) 

私はまた、あなたの代わりに静的な文字列、日付の変数を使用することをお勧め。

+0

where節を少し簡略化することができます。この答えを見てください。 http://stackoverflow.com/questions/5002689/how-can-i-determine-in-sql-server-if-a-datetime-range-overlaps-another/5002738#5002738 –

+0

ありがとう、Mikael。夜にかなり遅くこれを書き、ちょうど "ブルートを強制"。 – bitxwise