2012-12-09 155 views
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)) 

有沒有辦法做的更好,或者優化代碼對於大數據量的更好嗎?

回答

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 
    ) 
+0

是的,但我也想一)返回受預約日期的所有行,b)檢查如果對應於預定開始日期的第一行還對應於強制性DOW(DATEFIRST = row.DOW) – mko

+0

OK ,那麼:返回預訂的所有階段,但僅限於開始日期落在允許的DOW中,是的? –