酒店房间SQL中的状态生成

时间:2016-02-27 05:59:59

标签: sql sql-server

我有一个像这样的表结构

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.

1 个答案:

答案 0 :(得分: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  |