汇总日期范围,不计算mysql中的重叠

时间:2015-11-03 11:43:58

标签: mysql

我有简单的表格,其中包含start_dateend_date列。这些日期值可能重叠

id    start_date    end_date
1     2011-01-01    2012-04-01
2     2012-05-01    2013-10-01
3     2013-09-01    2014-09-01
4     2013-10-01    2014-08-01
5     2013-12-01    2014-11-01
6     2013-09-01    2014-09-01
7     2015-01-01    2015-11-01

问题是要在几个月内找到总和。例: id: 2,3,4,5,6重叠,因此我需要考虑end_date的MAX start_date和MIN 2,3,4,5,6,并添加日期差异1和7。

目前:我已经找到了如何估算月份的日期差异:

PERIOD_DIFF( DATE_FORMAT(end_date, '%Y%m') , DATE_FORMAT(start_date, '%Y%m') )

我知道这个想法是:

  1. 了解两个日期是否重叠。如果是,则相应地合并日期(如果需要,调整结束日期和开始日期)
  2. 遍历所有日期,估算月份的日期差异,总和并返回最终结果。
  3. 我一直在寻找类似的问题,无法解决和问题,如果你能帮助我会很好。我知道可以使用一些编程语言并在那里估计它,但是想用MySQL查询来编写它。

    由于

3 个答案:

答案 0 :(得分:1)

这是繁琐的事情,但应该得到你所需要的东西:

SELECT SUM(PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM a.end_date), EXTRACT(YEAR_MONTH FROM a.start_date))) months
  FROM (
    SELECT MIN(g.start_date) start_date, MAX(g.end_date) end_date 
      FROM (
        SELECT @group_id := @group_id + (@end_date IS NULL OR o.start_date > @end_date) group_id,
               start_date,
               @end_date := DATE(CASE 
                 WHEN (@end_date IS NULL OR o.start_date > @end_date) THEN o.end_date
                 ELSE GREATEST(o.end_date, @end_date)
               END) end_date  
          FROM overlap o
          JOIN (SELECT @group_id := 0, @end_date := NULL) init
      ORDER BY o.start_date ASC  
            ) g
  GROUP BY  g.group_id  
        ) a

最内层查询将重叠组中的句点组合在一起,在适当的位置延伸end_date。 end_date变形,因为我假设可能有前一个完全包围的句点。

下一个换行查询从每个组中提取整个范围。

外部查询总结了每个组的完整月份差异。所有组差异都按PERIOD_DIFF向下舍入到最接近的整月。

不幸的是我无法测试这个,因为SQLFiddle已经死了。

答案 1 :(得分:0)

如果您需要包含重叠在内的多个记录的总周期数,那么只需将每个记录的周期差异相加:

SELECT SUM(PERIOD_DIFF( DATE_FORMAT(end_date, '%Y%m') , DATE_FORMAT(start_date, '%Y%m') )) AS total_periods
FROM table WHERE ...

答案 2 :(得分:0)

我按照自己的方式在Stackoverflow上查看其他答案,它应该可以工作:

return new Promise(function(resolve, reject) {
  return Promise.map(files, function(file) {
      // LOGIC

      resolve({
        // object here
      })
  }, { concurrency: 3000 })
});
相关问题