Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
填补Mysql中数据范围之间的空白_Mysql_Sql - Fatal编程技术网

填补Mysql中数据范围之间的空白

填补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天内将不会有与之关联的发票。这些天我想估算成本,所以我

我有一个发票表,其中存储给定数据范围的发票,即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天内将不会有与之关联的发票。这些天我想估算成本,所以我需要以某种方式获得这些缺失的数据范围

我已经看到了一些类似问题的答案,但大多数都依赖于我无法创建的附加日历表


是否还有其他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感谢您的评论,您是对的,我必须更新我的答案,最好指定如果数据集有重叠的日期,它将不起作用