表定义会有所帮助,但在这里。这应该适用于 MS SQL Server,但是一旦您了解其背后的想法,将其转换为 MySQL 应该是一项微不足道的任务。
日历表只是一个标准实用程序表,其中包含对您的数据库有用的所有日期。如果您还没有,我建议您创建一个并填充它。
CREATE TABLE Calendar
(
date DATETIME NOT NULL,
is_holiday BIT NOT NULL,
-- any other columns that might be relevant for your business
CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED (date)
)
然后,您需要在表格中填充可能对您的业务有意义的任何日期。即使您回到 100 年并向前 100 年,表中的行数仍然少于 75K 行,并且它是按日期聚集的,因此它应该快速且易于使用。它使许多基于日期的查询变得更加简单。
SELECT
P.property_id,
C.date
FROM
Calendar C
JOIN Properties P ON 1=1
WHERE
C.date BETWEEN @search_start_date AND @search_end_date AND
NOT EXISTS
(
SELECT
*
FROM
Bookings B
WHERE
B.property_id = P.property_id AND
B.start_date <= DATEADD(dy, @slot_length, C.date) AND -- You would use MySQLs date function
B.end_date >= C.date
)
或者:
SELECT
P.property_id,
C.date
FROM
Calendar C
JOIN Properties P ON 1=1
LEFT OUTER JOIN Bookings B ON
B.property_id = P.property_id AND
B.start_date <= DATEADD(dy, @slot_length, C.date) AND -- You would use MySQLs date function
B.end_date >= C.date
WHERE
C.date BETWEEN @search_start_date AND @search_end_date AND
B.booking_id IS NULL