填补Mysql中数据范围之间的空白
我有一个发票表,其中存储给定数据范围的发票,即2012-01-01至2012-01-31之间日期的发票1。现在可能有几天没有关联发票,所以填补Mysql中数据范围之间的空白,mysql,sql,Mysql,Sql,我有一个发票表,其中存储给定数据范围的发票,即2012-01-01至2012-01-31之间日期的发票1。现在可能有几天没有关联发票,所以 > ID | START_DATE | END_DATE > ---------------------------- > 1 | 2012-01-01 | 2012-01-31 > 2 | 2012-02-05 | 2012-02-28 因此,在这种情况下,从2月起的5天内将不会有与之关联的发票。这些天我想估算成本,所以我
> ID | START_DATE | END_DATE
> ----------------------------
> 1 | 2012-01-01 | 2012-01-31
> 2 | 2012-02-05 | 2012-02-28
因此,在这种情况下,从2月起的5天内将不会有与之关联的发票。这些天我想估算成本,所以我需要以某种方式获得这些缺失的数据范围
我已经看到了一些类似问题的答案,但大多数都依赖于我无法创建的附加日历表
是否还有其他SQL解决方案,或者最好是实际获取发票,然后在我的应用程序中计算差距?如果数据集没有重叠日期,一种解决方案是使用这样的查询,提取所有缺失的范围:
select
r1.END_DATE + INTERVAL 1 DAY d1, MIN(r2.START_DATE) - INTERVAL 1 DAY d2
from
ranges r1 INNER JOIN ranges r2
ON r1.END_DATE <= r2.START_DATE
group by
r1.END_DATE
having
DATEDIFF(MIN(r2.START_DATE), r1.END_DATE) > 1
请看fiddle。我知道这不是问题的一部分,但对于未来的读者来说,如果数据集有重叠的日期,这就不起作用了。请参阅我在2012-03-17中添加了2012-03-14的范围,它错误地将第18行添加到了第20行,因为第5行与第16行到第19行的范围相矛盾。@Turnerj感谢您的评论,您是对的,我必须更新我的答案,最好指定如果数据集有重叠的日期,它将不起作用