0

私は次のような生理のセットを持っています

PERIODID PERIODSTART PERIODEND   PRICE STARTDOW
1        2012-12-01  2012-12-10  10    6
2        2012-12-11  2012-12-20  20    -1
3        2012-12-21  2012-12-30  30    -1

つまり、期間1の予約は土曜日に開始する必要がありますが、期間2と3の予約は開始しないでください。

2012年12月10日から2012年12月15日までの予約がある場合>-日数の期間をフィルタリングします(問題ありません)-土曜日に予約が開始されるかどうかを確認します。フィルタは一番上(または最初の行)のみに適用する必要がありますが、その方法がわかりません。予約が土曜日に開始されない場合、どの行も返されません。

私は試した

select * from periods p
where 
((@ReservationStart between p.periodstart and p.periodend)
or 
(@ReservationEnd between p.periodstart and p.periodend))
and ((select top 1 datepart(weekday, startdow) from periods where p.hotelID = period.hotelID order by period.periodstart) in (@datepart(weekday, @ReservationStart), -1))

それをより良くする方法、または大量のデータに対してコードをより良く最適化する方法はありますか?

4

1 に答える 1

0

うーん、最初の行の意味がわかりません。予約の最初の期間は?これを使用して、予約が正しい DOW で開始されるかどうかをテストしていますか?

set datefirst 1 -- make Monday return 1 when calling datepart(day,...)

-- if reservation starts on STARTDOW, this will return a single row.
-- if not, it will return an empty record set
select top (1) * from periods p
where @ReservationStart between p.periodstart and p.periodend
  and p.STARTDOW in (-1, datepart(day,@ReservationStart))

編集

たぶん、このようなものはありますか?

set datefirst 1 -- make Monday return 1 when calling datepart(day,...)

-- return all periods of the reservation
-- modify as necessary if you only want the first and last periods, as in your example.
select * from periods p
where p.periodend >= @ReservationStart
  and p.periodstart <= @ReservationEnd
  -- but only if the start date falls on an allowed DOW
  and exists (
    select * from periods p2
    where @ReservationStart between p2.periodstart and p2.periodend
      and p2.STARTDOW in (-1, datepart(day,@ReservationStart))
      and p2.hotelID = p.hotelID -- necessary correlation condition
    )
于 2012-12-10T03:14:19.173 に答える