【问题标题】:SQL Adding extra rows until dates (YYYYMMDD) columns matchSQL 添加额外的行直到日期(YYYYMMDD)列匹配
【发布时间】:2020-11-25 02:09:41
【问题描述】:

表1:

ID|开始日期 ID|结束日期 ID 468|20200101|20200104 534|20200103|20200104 123|20200106|20200108

需要的输出:

ID|开始日期 ID|结束日期 ID 468|20200101|20200104 468|20200102|20200104 468|20200103|20200104 468|20200104|20200104 534|20200103|20200104 534|20200104|20200104 123|20200106|20200108 123|20200107|20200108 123|20200108|20200108

抱歉,如果这没有得到很好的解释。表 1 列出了任务完成的开始和结束日期。每个 ID 都是唯一的条目。

我需要为每个 StartDateID 增加一行(每次加 1),直到它与 EndDate 匹配为止。

将一天添加到 StartDateID,直到它与 EndDateID 匹配,此时我们停止复制。

这有意义吗?

我玩过 CTE,但一无所获。

【问题讨论】:

  • 列的数据类型是什么?
  • 请向我们展示您的尝试。
  • @Rumbles 您似乎没有接受很多问题的答案?您是否熟悉接受和/或支持您的问题的答案?

标签: sql sql-server stored-procedures while-loop common-table-expression


【解决方案1】:

使用递归 CTE。假设这些列实际上是日期:

with cte as (
      select ID, StartDateID, EndDateID 
      from t
      union all
      select id, dateadd(day, 1, startdateid), enddateid
      from cte
      where startdateid < enddateid
     )
select *
from cte;

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

with cte as (
      select ID, convert(date, StartDateID) as startdate, convert(date, EndDateID) as enddate
      from t
      union all
      select id, dateadd(day, 1, startdate), enddate
      from cte
      where startdate < enddate
     )
select *
from cte;

Here 是一个 dbfiddle。

如果您的跨度可以超过 100 天,那么您需要在查询中添加 OPTION (MAXRECURSION 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多