如何在MySQL中组合重叠的日期范围?

如何在MySQL中组合重叠的日期范围?,mysql,date-range,Mysql,Date Range,我有一个表“lessons_holidays”。它可以包含几个假期日期范围,即 "holiday_begin" "holiday_end" 2016-06-15 2016-06-15 2016-06-12 2016-06-16 2016-06-15 2016-06-19 2016-06-29 2016-06-29 如果日期范围重叠,我希望合并每个条目。我需要如下输出: "holiday_begin" "holiday

我有一个表“lessons_holidays”。它可以包含几个假期日期范围,即

"holiday_begin"    "holiday_end" 
2016-06-15         2016-06-15
2016-06-12         2016-06-16
2016-06-15         2016-06-19
2016-06-29         2016-06-29
如果日期范围重叠,我希望合并每个条目。我需要如下输出:

"holiday_begin"    "holiday_end" 
2016-06-12         2016-06-19
2016-06-29         2016-06-29
SQL:下面的SQL语句加载所有行。现在我卡住了

SELECT lh1.holiday_begin, lh1.holiday_end 
FROM local_lessons_holidays lh1 
WHERE lh1.holiday_impact = '1' AND
(DATE_FORMAT(lh1.holiday_begin, '%Y-%m') <= '2016-06' AND DATE_FORMAT(lh1.holiday_end, '%Y-%m') >= '2016-06') AND
lh1.uid = '1' 
选择lh1.holiday\u开始,lh1.holiday\u结束
来自当地的课程和假期lh1
其中lh1.u影响='1'和
(日期格式(lh1.holiday开始,%Y-%m')='2016-06')和
lh1.uid='1'

这是一个很难解决的问题,因为您使用的是MySQL。这里有一个想法。找到每个组中所有假日的开始日期。然后“开始”标志的累积和处理这些组。剩下的只是聚合

假设您没有重复记录,则以下操作应满足您的要求:

select min(holiday_begin) as holiday_begin, max(holiday_end) as holiday_end
from (select lh.*, (@grp := @grp + group_flag) as grp
      from (select lh.*,
                   (case when not exists (select 1
                                          from lessons_holidays lh2
                                          where lh2.holiday_begin <= lh.holiday_end and
                                                lh2.holiday_end > lh.holiday_begin and
                                                (lh2.holiday_begin <> lh.holiday_begin or
                                                 lh2.holiday_end < lh.holiday_end)

                                         )
                         then 1 else 0
                    end) as group_flag
            from lessons_holidays lh
           ) lh cross join
           (select @grp := 0) params
      order by holiday_begin, holiday_end
    ) lh
group by grp;

如图所示。

这在MySQL中很难做到。你还有其他数据库可以使用吗?非常感谢。我稍后会试用。结果我只得到:2016-06-12 | 2016-06-29。我还可以通过以下sql语句得到这个结果:“选择MIN(假日开始)作为假日开始,MAX(假日结束)当假日结束时,1“@Bonaparte…修复了当地的假日。问题是重叠逻辑。太好了!谢谢!我不能作为新手投票。现在我必须了解它是如何工作的;)@Bonaparte…从最内部的子查询开始,然后找到解决方法。
select min(holiday_begin) as holiday_begin, max(holiday_end) as holiday_end
from (select lh.*, (@grp := @grp + group_flag) as grp
      from (select lh.*,
                   (case when not exists (select 1
                                          from lessons_holidays lh2
                                          where lh2.holiday_begin <= lh.holiday_begin and
                                                lh2.holiday_end > lh.holiday_begin and
                                                lh2.holiday_begin <> lh.holiday_begin and
                                                lh2.holiday_end <> lh.holiday_end
                                         )
                         then 1 else 0
                    end) as group_flag
            from lessons_holidays lh
           ) lh cross join
           (select @grp := 0) params
      order by holiday_begin, holiday_end
    ) lh
group by grp;