MySQL:将日期范围扩展到新行
我在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-
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