一个表具有 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。
现在,用户需要添加一个 Booking Window 时段,该时段也必须采用最高的 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
现在,如果日期是 05/16/2013 并且预订日期是 5/1/2013,则查询需要返回 $75.00
如何达到预期的效果?请注意,这是一个简化的示例,但实际表中将有数百行。
select top 1 price
where :Date between PriceValidFrom and PriceValidTo
and :BookingDate between BookingWindowFrom and BookingWindowTo