テーブルには PriceValidFrom 、 PriceValidTo 、 BookingWindowFrom 、 BookingWindowTo の日付フィールドと価格通貨フィールドがあります。クライアントは行をランダムに挿入または更新します。たとえば、PriceValid の期間が他の行よりも短い行もありますが、同じ月内 (価格が異なる) である可能性があります。他の行は同一の PriceValid 期間を持つ場合がありますが、BookingWindow 期間のみが異なる場合があります。テーブルは決して掃除されず、すべてが受け入れられます。日付を指定すると、PriceValidFrom の日付が最も高い行から価格を返すクエリが必要です。以下の例では、テーブルとクエリ ステートメントを考慮します。
PriceValidFrom PriceValidTo Price
05/01/2013 05/30/2013 $100.00
05/15/2013 05/20/2013 $50.00
疑似SQL
select top 1 price
where :Date between PriceValidFrom and PriceValidTo
order by PriceValidFrom DESC, Price
日付が 2013 年 5 月 16 日の場合、クエリは予想どおり $50.00 を返します。
ここで、ユーザーは、最高の BookingWindowFrom も取得する必要がある予約ウィンドウ期間を追加する必要があります。
PriceValidFrom PriceValidTo Price BookingWindowFrom BookingWindowTo
05/01/2013 05/30/2013 $100.00 4/1/2013 5/30/2013
05/15/2013 05/20/2013 $50.00 4/1/2013 5/30/2013
05/15/2013 05/20/2013 $75.00 5/1/2013 5/30/2013
ここで、日付が 2013 年 5 月 16 日で、予約日が 2013 年 5 月 1 日の場合、クエリは $75.00 を返す必要があります。
期待される結果を達成する方法は?これは単純化された例ですが、実際のテーブルには何百もの行があることに注意してください。
select top 1 price
where :Date between PriceValidFrom and PriceValidTo
and :BookingDate between BookingWindowFrom and BookingWindowTo