Создать список с датами, которые находятся между начальной и конечной датами - PullRequest
0 голосов
/ 05 мая 2018

Использование SQL Server 2016. У меня есть таблица с разными датами начала и окончания

Start            | End
-----------------+-----------------
2018-01-01 00:00 | 2018-01-01 23:59  
2018-01-12 05:33 | 2018-01-13 13:31  
2018-01-24 22:00 | 2018-01-27 01:44

Теперь я хочу создать список (хранящийся в табличной переменной), который содержит даты (в минутных шагах от начала до конца) для каждой записи. В исходной таблице может быть несколько записей.

Результат:

2018-01-01 00:00 (1st row StartDate)   
2018-01-01 00:01  
2018-01-01 00:02  
2018-01-01 00:03  
... until  
2018-01-01 23:59 (1st row EndDate)  
followed by  
2018-01-12 05:33 (2nd row StartDate)   
2018-01-12 05:34  
2018-01-12 05:35  
2018-01-12 05:36  
... until  
2018-01-13 13:31 (2nd row EndDate)  
and so on.

1 Ответ

0 голосов
/ 05 мая 2018

В стандарте ANSI SQL и многих базах данных вы можете использовать рекурсивный CTE:

with recursive cte as (
      select datestart as dte, datestart, dateend
      from t
      union all
      select dte + interval '1 minute', datestart, dateend
      from cte
      where dte < dateend
     )
select dte
from cte
order by datestart, dateend, dte;

Обратите внимание, что это синтаксис ANSI. Ключевое слово recursive может быть запрещено некоторыми базами данных. Дата арифметики зависит от базы данных. Некоторые базы данных могут ограничивать число генерируемых строк, поэтому значения по умолчанию необходимо переопределить.

EDIT:

В SQL Server это будет:

with cte as (
      select datestart as dte, datestart, dateend
      from t
      union all
      select dateadd(minut, 1, dte), datestart, dateend
      from cte
      where dte < dateend
     )
select dte
from cte
order by datestart, dateend, dte
option (maxrecursion 0);
...