我有一个像这样的表结构
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。?
提前致谢。
答案 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 |