MySQL可用性日历

MySQL可用性日历,mysql,sql,calendar,Mysql,Sql,Calendar,我有一个预订系统,我想显示列表的月历视图。我有下面的表结构(还有许多其他列) sys_日历保存从2000-01-01到2040-12-31的所有日期 dt ------------ 2000-01-01 2000-01-02 2000-01-03 .... 2040-12-30 2040-12-31 我想做的是显示特定列表的月历。例如我想在2013年4月(在预订表上的2013-04-01和2013-04-30之间)显示列表id=10的日历 我知道我必须加入sys\u calendar和book

我有一个预订系统,我想显示列表的月历视图。我有下面的表结构(还有许多其他列)

sys_日历
保存从2000-01-012040-12-31的所有日期

dt
------------
2000-01-01
2000-01-02
2000-01-03
....
2040-12-30
2040-12-31
我想做的是显示特定列表的月历。例如我想在2013年4月(在
预订
表上的2013-04-01和2013-04-30之间)显示
列表id
=10的日历


我知道我必须加入
sys\u calendar
bookings
表格,但不确定如何加入。

我想这对您有用:

SELECT  c.dt,
        CASE WHEN COUNT(b.id) > 0 THEN 'No' ELSE 'Yes' END AS Availability
FROM    sys_calendar c
        LEFT JOIN bookings b
            ON b.Listing_id = 10
            AND c.dt BETWEEN b.Start_Date AND b.End_Date
GROUP BY c.dt;

此外,如果要显示多个可用性,可以使用:

SELECT  c.dt,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 1 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability1,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 2 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability2,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 3 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability3,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 4 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability4
FROM    sys_calendar c
        LEFT JOIN bookings b
            ON c.dt BETWEEN b.Start_Date AND b.End_Date
WHERE   c.dt BETWEEN '20130401' AND '20130430'
GROUP BY c.dt;

我想这对你来说很有用:

SELECT  c.dt,
        CASE WHEN COUNT(b.id) > 0 THEN 'No' ELSE 'Yes' END AS Availability
FROM    sys_calendar c
        LEFT JOIN bookings b
            ON b.Listing_id = 10
            AND c.dt BETWEEN b.Start_Date AND b.End_Date
GROUP BY c.dt;

此外,如果要显示多个可用性,可以使用:

SELECT  c.dt,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 1 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability1,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 2 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability2,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 3 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability3,
        CASE WHEN COUNT(CASE WHEN b.Listing_id = 4 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability4
FROM    sys_calendar c
        LEFT JOIN bookings b
            ON c.dt BETWEEN b.Start_Date AND b.End_Date
WHERE   c.dt BETWEEN '20130401' AND '20130430'
GROUP BY c.dt;

谢谢你,GarethD。这两个查询都很有效,但有一个影响整个系统的小问题。根据您的回答,我已将第一个查询重写为
SELECT c.dt,CASE WHEN COUNT(b.id)>0,然后“No”或“Yes”结束为sys_calendar中的可用性c在b.listing_id=16和c.dt>=b.start_date和c.dt。预订的最后一天必须标记为可用,因为客人在下午12点之前离开房间,所以房间在下午再次可用。我想我忘记告诉你了。谢谢你,加雷思。这两个查询都很有效,但有一个影响整个系统的小问题。根据您的回答,我已将第一个查询重写为
SELECT c.dt,CASE WHEN COUNT(b.id)>0,然后“No”或“Yes”结束为sys_calendar中的可用性c在b.listing_id=16和c.dt>=b.start_date和c.dt。预订的最后一天必须标记为可用,因为客人在下午12点之前离开房间,所以房间在下午再次可用。我想我忘了告诉你这个。