我有一个公寓预订系统,需要逐个属性地生成一个日期期间内占用天数与空置天数的报告。
请记住,在所选时间段内,某些预订可能在开始/结束日期之前和/或之后结束。
我发现了这个 -一个月内一个日期范围内的 MySQL 天数(预订表) - 这是正确的,但我不希望它是按月固定的,而是在两个可变日期之间。
理想情况下,我只想使用 MySQL 来执行此操作,但如果需要 PHP,那很好。
我能想到的唯一方法是单独循环浏览每一天,并检查当天是否有人入住,但这似乎效率低得令人难以置信。
编辑:我设法从其他问题改编代码如下:
CREATE TABLE IF NOT EXISTS `view_bookings` (
`bkg_id` int(11) NOT NULL AUTO_INCREMENT,
`apt_id` int(10) NOT NULL,
`apt_name` varchar(50) NOT NULL,
`start_date` date DEFAULT NULL,
`end_date` date DEFAULT NULL,
PRIMARY KEY (`bkg_id`),
UNIQUE KEY `bkg_id_UNIQUE` (`bkg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `view_bookings` (`apt_id`, `apt_name`, `start_date`, `end_date`) VALUES
(1, 'Apartment One', '2012-09-02', '2013-02-05'),
(1, 'Apartment One', '2013-02-05', '2013-07-05'),
(2, 'Apartment Two', '2012-12-25', '2013-02-28'),
(2, 'Apartment Two', '2013-03-01', '2013-04-10'),
(2, 'Apartment Two', '2013-04-16', '2013-09-19'),
(3, 'Apartment Three', '2013-01-01', '2013-02-04'),
(3, 'Apartment Three', '2013-02-06', '2013-02-12'),
(3, 'Apartment Three', '2013-02-16', '2013-02-27'),
(3, 'Apartment Three', '2013-02-27', '2013-03-14'),
(3, 'Apartment Three', '2013-03-19', '2013-06-12');
SELECT
SUM(
1 + DATEDIFF(
LEAST(end_date, '2013-03-30'),
GREATEST(start_date, '2013-02-01')
)
) AS days,
apt_name,
apt_id
FROM
view_bookings
WHERE
start_date <= '2013-03-30'
AND '2013-02-01' <= end_date
GROUP BY
apt_id
这可行,但是如果有重叠的预订,那么它会计算两次天数。我怎样才能防止这种情况?