mysql - 计算 MySQL 5.6 中重叠日期范围的最大数量

标签 mysql sql mysql-5.6

我正在创建一个车辆租赁应用程序。我试图找到给定日期内的重叠预订。我遇到了类似的问题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/

相关文章:

mysql - 将Web表单数据提交到MySQL数据库表时如何获取登录Azure B2C用户的id?

java - MYSQL数据库很多连接问题

sql - 配置单元 : How to perform JOIN Operation with GROUP BY

mysql - 固定长度列最有效的数据类型

mysql - 使用云 SQL 从 MySQL 5.5 迁移到 GAE : Microtime support?

mysql列应支持1024个字符的输入长度

mysql - Snap Web 应用程序与 MySQL 连接

c# - 无法从 C# Windows 应用程序连接到 MySQL

'map' 语句的 SQL 查询性能

对表的子查询而不是整个表进行 Join 时的 SQL 性能差异