2016-02-27 44 views
2

我有這樣的酒店房態代SQL

id    int 
checkinttime datetime 
checkouttime datetime 
roomid   int 

表結構我在此表中記錄的簽入和退房時間。我的問題是如何生成日期報告,以生成是否佔用空間或不在此日期範圍內。

room 3/1/2016 3/2/2016 3/3/2016 6/4/2016 
r1  P   V  V  P 
r2  v   p  p  p 

其中p表示佔用,V表示空置。如何爲此編寫SQL。?

在此先感謝。

This is the structure. customer select start date and end date. With that parameters, room and date wise details are needed.

+0

你有房的另一個表,不是嗎? – wajeeh

+0

是的,有一張桌子。 roomid是外鍵.. – siyadkk

+0

我認爲,不要將日期範圍設置爲動態,請將房間ID用作列,並將日期範圍用作行。 – Utsav

回答

1

一個解決方案是使用靜態查詢過的房間爲列如下:

;WITH dates(date) AS (
    SELECT @startDate 
    UNION ALL 
    SELECT DATEADD(DAY, 1, date) 
    FROM dates 
    WHERE date < @endDate 
), occupied AS (
SELECT date, c.booking_id 
FROM dates d 
    LEFT JOIN -- You can use `JOIN` only also to remove free dates 
    CheckStatus c ON d.date BETWEEN c.checkin_time AND c.checkout_time 
) 
SELECT date 
    , MIN(CASE WHEN id = 1 THEN 'P' ELSE 'V' END) AS 'r1' 
    , MIN(CASE WHEN id = 2 THEN 'P' ELSE 'V' END) AS 'r2' 
FROM occupied 
GROUP BY date; 

其結果將是這樣的:

date  | r1 | r2 | 
-----------+----+----+ 
2016-03-01 | P | V | 
2016-03-02 | V | P | 
2016-03-03 | V | P | 
2016-03-04 | V | P | 
+0

請用參數startdate和結束日期 – siyadkk

+0

與這些參數可以更容易;)。 –

+0

感謝Sha的支持。我上傳了圖片。請檢查一下。 – siyadkk