Рассчитать количество занятых дней в течение периода с использованием MySQL и PHP

У меня есть система бронирования квартир и вам нужно создать отчет о количестве оккупированных дней или незанятых днях в течение периода времени на основе имущества по свойствам.

Принимая во внимание в течение выбранного периода, что некоторые заказы могут начинаться до и / или заканчиваться после даты начала / окончания.

Я нашел это: MySQL Number of Days внутри DateRange, внутри месяца (таблица бронирования), который находится по правильной линии, но я не хочу, чтобы он фиксировался по месяцам, но между двумя датами переменных.

В идеале я хотел бы сделать это только с использованием 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 

Это работает, однако, если есть перекрывающиеся заказы, тогда он рассчитывает дни два раза. Как я могу это предотвратить?