我有简单的表格,其中包含start_date
和end_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') )
我知道这个想法是:
我一直在寻找类似的问题,无法解决和问题,如果你能帮助我会很好。我知道可以使用一些编程语言并在那里估计它,但是想用MySQL查询来编写它。
由于
答案 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 })
});