基于单条记录按条件批量插入多行数据的SQL实现
没问题,我来帮你搞定这个将Table A的日期范围拆分成工作日并批量插入Table B的需求。下面针对不同主流数据库给你具体的实现方案,都是直接能用的代码哦:
核心思路
不管用哪种数据库,核心逻辑都是三步:
- 生成每条记录
Start_Date到End_Date之间的所有日期 - 过滤掉周末(非工作日)
- 将符合条件的日期和对应
LID插入Table B,每条记录的Start_Date和End_Date都设为当前拆分出的日期
1. SQL Server 实现
用递归CTE生成日期序列,再过滤周末:
WITH DateRange AS ( SELECT LID, Start_Date AS Current_Date, End_Date FROM TableA UNION ALL SELECT LID, DATEADD(DAY, 1, Current_Date), End_Date FROM DateRange WHERE Current_Date < End_Date ) INSERT INTO TableB (LID, Start_Date, End_Date) SELECT LID, Current_Date, Current_Date FROM DateRange WHERE DATEPART(dw, Current_Date) NOT IN (1, 7) -- 注意:英语环境下1=周日,7=周六,其他语言环境可能需要调整 OPTION (MAXRECURSION 0); -- 如果日期跨度超过100天,必须加这个参数取消递归限制
2. MySQL 实现
同样用递归CTE,搭配WEEKDAY()函数判断周末:
WITH RECURSIVE DateRange AS ( SELECT LID, Start_Date AS Current_Date, End_Date FROM TableA UNION ALL SELECT LID, DATE_ADD(Current_Date, INTERVAL 1 DAY), End_Date FROM DateRange WHERE Current_Date < End_Date ) INSERT INTO TableB (LID, Start_Date, End_Date) SELECT LID, Current_Date, Current_Date FROM DateRange WHERE WEEKDAY(Current_Date) NOT IN (5, 6); -- WEEKDAY规则:0=周一,5=周六,6=周日
3. PostgreSQL 实现
PostgreSQL可以直接用generate_series生成日期范围,更简洁:
WITH DateRange AS ( SELECT a.LID, d::DATE AS Current_Date FROM TableA a CROSS JOIN generate_series(a.Start_Date, a.End_Date, INTERVAL '1 day') d ) INSERT INTO TableB (LID, Start_Date, End_Date) SELECT LID, Current_Date, Current_Date FROM DateRange WHERE EXTRACT(DOW FROM Current_Date) NOT IN (0, 6); -- DOW规则:0=周日,6=周六
注意事项
- 不同数据库的日期函数规则可能有差异,比如判断周末的参数,要根据你的数据库语言环境调整
- 如果Table A有多条记录,以上代码都能自动批量处理所有记录
- 确保Table A的
Start_Date和End_Date是日期类型,如果是字符串,需要先用CAST()或CONVERT()转换为日期
内容的提问来源于stack exchange,提问作者TheLegend28
相关产品推荐
相关产品推荐

