我正在创建一个车辆租赁应用程序。我试图找到给定日期内的重叠预订。我遇到了类似的问题Count maximum number of overlapping date ranges in MySQL但这仅适用于 MySQL 8.0。
我针对我的问题修改了上述问题。 我需要没有窗口函数的 MySQL 5.6 解决方案。
create table if not exists BOOKING
(
start datetime null,
end datetime null,
vehicle_id varchar(255),
id int auto_increment
primary key
);
INSERT INTO BOOKING (start, end, vehicle_id)
VALUES
('2020-02-06 10:33:55', '2020-02-07 10:34:41', 111),
('2020-02-08 10:33:14', '2020-02-10 10:33:57', 111),
('2020-02-06 10:32:55', '2020-02-07 10:33:32', 222),
('2020-08-06 10:33:03', '2020-02-11 10:33:12', 111),
('2020-02-12 10:31:38', '2020-02-15 10:32:41', 111),
('2020-02-09 09:48:44', '2020-02-10 09:50:37', 222);
假设如果我指定开始时间为 2020-02-05,结束时间为 2020-02-11,则应返回 2,因为从 2020-02-06 到 2020-02-10,车辆 111 的最大使用量为 2
5 6 7 8 9 10 11
<--> <------>
<----------------> (Vehicle Id 111, ANSWER should be 2)
for vehicle id 222, (For same query)
5 6 7 8 9 10 11
<--> <---> (Vehicle Id 222, ANSWER should be 1)
所以我期望输入开始(2020-02-05)和结束(2020-02-11)的总体输出
+---------+-------+
| vehicle | usage |
+---------+-------+
| 111 | 2 |
| 222 | 1 |
+---------+-------+
我需要涵盖以下内容的解决方案
- 在传递 start_date 和 end_date 时,我的查询将仅返回该范围内的数据
- 如果没有找到数据应返回
vehicle_id 0
最佳答案
最大重叠数发生在租赁开始时(尽管它可能会持续一段时间,但这就是您所关心的)。
您可以使用以下方法计算每次启动的值:
SELECT b.vehicle_id, b.start, COUNT(*)
FROM booking b JOIN
booking b2
ON b2.vehicle_id = b.vehicle_id AND
b2.start <= b.start AND
b2.end > b.start
WHERE b.start <= $end and b.end >= $start
GROUP BY b.vehicle_id, b.start;
然后求最大值:
SELECT vehicle_id, MAX(overlaps)
FROM (SELECT b.vehicle_id, b.start, COUNT(*) as overlaps
FROM booking b JOIN
booking b2
ON b2.vehicle_id = b.vehicle_id AND
b2.start <= b.start AND b2.end > b.start
GROUP BY b.vehicle_id, b.start
) b
GROUP BY vehicle_id;
Here是一个数据库<> fiddle 。
此类查询的性能永远不会像使用窗口函数那样好。但是,(vehicle_id, start, end)
上的索引会有所帮助。
关于mysql - 计算 MySQL 5.6 中重叠日期范围的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65229888/