在日期(yyyymmdd)列匹配之前添加额外行的sql server

4bbkushb  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(332)

表1:

  1. ID|StartDateID|EndDateID
  2. 468|20200101|20200104
  3. 534|20200103|20200104
  4. 123|20200106|20200108

所需输出:

  1. ID|StartDateID|EndDateID
  2. 468|20200101|20200104
  3. 468|20200102|20200104
  4. 468|20200103|20200104
  5. 468|20200104|20200104
  6. 534|20200103|20200104
  7. 534|20200104|20200104
  8. 123|20200106|20200108
  9. 123|20200107|20200108
  10. 123|20200108|20200108

如果解释不当,我道歉。表1列出了任务完成的开始和结束日期。每个id都是唯一的条目。
我需要为每个startdateid多加一行(每次加1),直到它匹配enddate。
一天被添加到startdateid,直到它与enddateid匹配,此时我们停止复制。
这有道理吗?
我和cte打过交道,但一无所获。

gk7wooem

gk7wooem1#

使用递归cte。假设列实际上是日期:

  1. with cte as (
  2. select ID, StartDateID, EndDateID
  3. from t
  4. union all
  5. select id, dateadd(day, 1, startdateid), enddateid
  6. from cte
  7. where startdateid < enddateid
  8. )
  9. select *
  10. from cte;

如果列不是日期,我建议将它们转换为:

  1. with cte as (
  2. select ID, convert(date, StartDateID) as startdate, convert(date, EndDateID) as enddate
  3. from t
  4. union all
  5. select id, dateadd(day, 1, startdate), enddate
  6. from cte
  7. where startdate < enddate
  8. )
  9. select *
  10. from cte;

这是一把小提琴。
如果你的跨度可以超过100天,那么你需要添加 OPTION (MAXRECURSION 0) 到查询。

展开查看全部

相关问题