查询Mysql中未排序的多个日期范围的给定月份的日期范围差距

我有一个相当棘手的日历间隙项目,我需要一些帮助。我希望我已经很好地概述了我的问题,并真的很感谢在解决这个问题方面的任何帮助。

我需要查找多个日期范围之间的日历间隔。我有一个带有汽车租赁的mysql数据库。我需要一个查询,显示所有的汽车,有一个差距在一个给定的月份。我使用的是MySQL5.7,所以不能使用递归查询。

下面是我的数据库(Mysql)中的内容:

表:

Car   ||  from_date   || to_date
Ford  ||  2021-05-01  || 2021-05-09 (10 day gap)
Ford  ||  2021-05-20  || 2021-05-30 (0 day gap till next)
Ford  ||  2021-06-01  || 2021-06-07 (7 day gap till next)
Ford  ||  2021-06-15  || 2021-06-20 (5 day gap till next)
Ford  ||  2021-06-26  || 2021-06-30 (0 day gap till next)
Chevy ||  2021-04-20  || 2021-04-29 (7 day gap till next)
Chevy ||  2021-05-07  || 2021-05-12 (7 day gap till next)
Chevy ||  2021-05-20  || 2021-05-23 (8 day gap till next)
Chevy ||  2021-06-02  || 2021-06-10 (13 day gap till next)
Tesla ||  2021-04-15  || 2021-04-30 
Tesla ||  2021-05-01  || 2021-05-30 

场景:在上面的表格中,我创建了以下场景:福特:在5月和6月之间完全存在差距。雪佛兰:在月初和月末有重叠的间隙特斯拉:整个6月都是开放的

警告:在本例中,这些记录是按from_date排序的,但它们可能不在实际生活中,因此您不能接受它们的顺序。这就是为什么下面提到的“显示间隙”的例子对我不起作用。

预期/可接受的结果:下面的表格显示了我的预期,但我只需要知道一辆车在给定的月份是否有任何差距。所以,对于05,我不需要雪佛兰上市3次。如果我们可以通过拉取第一个实例来更快地构建它。只需显示每辆车的第一场比赛就可以了。

TRUE结果:月份= 05,间隔=7

+------------+------------+------------+------+
|    Car     |  gap_start |  gap_end   | gap  |
+------------+------------+------------+------+
|    Ford    | 2021-05-09 | 2021-05-20 |  10  |
|    Chevy   | 2021-04-29 | 2014-05-07 |   7  |
|    Chevy   | 2021-05-12 | 2014-05-20 |   7  |
|    Chevy   | 2021-05-23 | 2014-06-02 |   8  |
+------------+------------+------------+------+

可接受的结果:月份= 05,间隔=7

+------------+------------+
|    Car     |  has_gap   |
+------------+------------+
|    Ford    |     1      |
|    Chevy   |     1      |
+------------+------------+

TRUE结果:月份= 06,间隔=5

+------------+------------+------------+------+
|    Car     |  gap_start |  gap_end   | gap  |
+------------+------------+------------+------+
|    Ford    | 2021-06-07 | 2021-06-15 |   7  |
|    Ford    | 2021-06-20 | 2021-06-26 |   5  |
|    Chevy   | 2021-06-10 | 2021-06-31 |  20  |
|    Tesla   | 2021-06-01 | 2021-06-30 |  30  |
+------------+------------+------------+------+

可接受的结果为:月份= 06,间隔=5

+------------+----------+
|    Car     |  has_gap |
+------------+----------+
|    Ford    |     1    |
|    Chevy   |     1    |
|    Tesla   |     1    |
+------------+----------+

注:我意识到我的数学不适合特斯拉,因为我不得不伪造日期。我不关心如何返回一个,只要特斯拉包括在结果中。

下一步:我可能会为每辆车建立一个带有预订日期的日历(水平条带显示),所以我想一旦我得到结果,我就会遍历它们,并拉出该给定月份的所有预订来构建日历。除非有人能计算出如何在一个查询中完成所有这些操作并保持它的速度。

我花了一些时间来回答这个问题,希望我没有犯任何错误。请随时提问或澄清。还有,提前感谢你的帮助。

类似的问题,但距离工作还不够近。Show gaps between dates in MySQL

转载请注明出处:http://www.xgclsm.com/article/20230526/2325684.html