SQL Добавление дополнительных строк до совпадения дат (ГГГГММДД) столбцов - PullRequest
0 голосов
/ 05 августа 2020

Таблица1:

ID|StartDateID|EndDateID 
468|20200101|20200104
534|20200103|20200104
123|20200106|20200108

Требуемый вывод:

ID|StartDateID|EndDateID 
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 указаны даты начала и окончания завершения задачи. Каждый идентификатор - это уникальная запись.

Мне нужна дополнительная строка для каждого StartDateID (добавляя 1 каждый раз), пока она не совпадет с EndDate.

День добавляется к StartDateID, пока он не совпадет с EndDateID, в этот момент мы останавливаем репликацию.

Есть ли в этом смысл?

Я играл с CTE, но ничего не добился.

1 Ответ

4 голосов
/ 05 августа 2020

Используйте рекурсивный 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;

Здесь - это db < > fiddle.

Если ваши промежутки могут превышать 100 дней, вам нужно добавить OPTION (MAXRECURSION 0) в запрос.

...