MySQL:将日期范围扩展到新行

MySQL:将日期范围扩展到新行,mysql,sql,Mysql,Sql,我在MySQL中有一个表,其中包含每个键的最小和最大日期值: key | minDate | maxDate 1 2011-01-01 2011-01-10 2 2011-02-13 2011-02-15 3 2011-10-19 2011-12-10 如何创建一个新表,其中每个键的minDate和maxDate之间的每个日期包含一行: key | Date 1 2011-01-01 1 2011-01-

我在MySQL中有一个表,其中包含每个键的最小和最大日期值:

key |   minDate   |   maxDate
 1     2011-01-01   2011-01-10 
 2     2011-02-13   2011-02-15
 3     2011-10-19   2011-12-10
如何创建一个新表,其中每个键的minDate和maxDate之间的每个日期包含一行:

key |     Date   
 1     2011-01-01
 1     2011-01-02
 ...     ...
 1     2011-01-10
 2     2011-02-13
 2     2011-02-14
 2     2011-02-15
 3     2011-10-19
 ...     ...

根据记忆,可能是这样的:

create table #res (
key int,
Date datetime
)

declare @minD datetime, @maxD datetime
select @minD = min(minDate), @maxD = max(maxDate) from tablename

while @minD <= @maxD do
   insert into #res
   select key, @minD from tablename where @minD >= minDate and @minD <= maxDate

   select @minD = dateadd(@minD, interval 1 day)
end while;

select key, Date from #res

drop table #res
使用,您可以执行以下操作:

    SELECT "key", minDate + INTERVAL i DAY
      FROM mytable
INNER JOIN integers
           ON i <= DATEDIFF(maxDate, minDate)
当然,这假设integers表的列名为i


从那里,您可以使用INSERT INTO。。。选择。

使用递归公共表表达式需要mysql 8或mariadb 10.2+:

with recursive expanded_ranges as (
    select id, mindate dt
    from ranges
    union all
    select expanded_ranges.id, expanded_ranges.dt+interval 1 day
    from expanded_ranges
    join ranges on expanded_ranges.id=ranges.id and dt<maxdate
)
select * From expanded_ranges;

您还可以动态生成整数选择t1+t2*10作为i从选择0 t1联合选择1联合选择2联合选择3联合选择4联合选择5联合选择6联合选择7联合选择8联合选择9 t1,选择0 t2联合选择1联合选择2联合选择3联合选择4联合选择5联合选择6联合选择7联合选择8联合选择9 t2我不知道这是什么,但不是mysql