Получить все даты в диапазоне дат в SQL Server

Я получил этот пример из одного вопроса StackOverflow, который был задан, но я не смог заставить его работать в соответствии с моими потребностями.

WITH DateTable
AS
(
    SELECT CAST('20110101' as Date) AS [DATE]
    UNION ALL
    SELECT DATEADD(dd, 1, [DATE]) FROM DateTable 
    WHERE DATEADD(dd, 1, [DATE]) < cast('20110131' as Date)
)
SELECT dt.[DATE] FROM [DateTable] dt

Вход-

ID |   FromDate  | ToDate
=============================
1  |  2011-11-10 | 2011-11-12
2  |  2011-12-12 | 2011-12-14

Выход -

SN |   Dates     | 
==================
1  |  2011-11-10 | 
2  |  2011-11-11 | 
3  |  2011-11-12 | 
4  |  2011-12-12 | 
5  |  2011-12-13 | 
6  |  2011-12-14 |

Посмотрите, этот код отлично работает для статических дат. Но в моем случае у меня есть таблица, содержащая три столбцаId, FromDate, ToDate, Теперь я хочу преобразовать каждый диапазон в каждой строке в отдельные даты.

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

Пожалуйста помоги.

 J Cooper04 февр. 2012 г., 21:01
Только один раз, максимальная рекурсия по умолчанию равна 100
 F43G4N04 февр. 2012 г., 11:57
Вы пытаетесь получить все действительные даты между FromDate и ToDate для каждого идентификатора? Я не уверен, что вы пытаетесь достичь.

Ответы на вопрос(3)

create table Dates (Id int, FromDate date, ToDate date)
insert into Dates values (1, '2011-11-10', '2011-11-12')
insert into Dates values (2, '2011-12-12', '2011-12-14')

with DateTable as
(
    select FromDate as Dt, ToDate
    from Dates
    union all
    select DATEADD(D, 1, Dt), ToDate
    from DateTable
    where DATEADD(D, 1, Dt) <= ToDate
)
select ROW_NUMBER() over (order by Dt) as SN, Dt as Dates
from DateTable
order by Dt

Как насчет этого?

--DROP TABLE #Test
CREATE TABLE #Test(ID int, FromDate datetime, ToDate datetime)
INSERT INTO  #Test VALUES (1, '2011-11-10', '2011-11-12')
INSERT INTO  #Test VALUES (2, '2011-12-12', '2011-12-14')

;
WITH DateTable
AS
(
    SELECT  ID, FromDate, ToDate, 0 AS Seed FROM #Test
    UNION   ALL
    SELECT  ID, DATEADD(dd, 1, FromDate), ToDate, Seed + 1
    FROM    DateTable
    WHERE   DATEADD(dd, 1, FromDate) <= ToDate
)
SELECT  --*
        ROW_NUMBER() OVER (ORDER BY ID, Seed) SN, FromDate AS Dates
FROM    DateTable
Решение Вопроса

С небольшой помощью таблицы чисел.

declare @T table
(
  ID int identity primary key,
  FromDate date,
  ToDate date
)

insert into @T values
('2011-11-10', '2011-11-12'),
('2011-12-12', '2011-12-14')

select row_number() over(order by D.Dates) as SN,
       D.Dates
from @T as T
  inner join master..spt_values as N
    on N.number between 0 and datediff(day, T.FromDate, T.ToDate)
    cross apply (select dateadd(day, N.number, T.FromDate)) as D(Dates)
where N.type ='P'

ПопробуйДанные SE

 J Cooper04 февр. 2012 г., 21:29
Я выполнил запрос по ссылке, ваши результаты переходят с 11-09 - 11-11 вместо 11-10 на 11-12, кроме +1 для альтернативного подхода
 Mikael Eriksson04 февр. 2012 г., 21:32
@JCooper - Это действительно странно. Когда я нажимаю на ссылку, она показывает 10–12 и 12–14. Интересно, почему она отличается?
 J Cooper04 февр. 2012 г., 21:18
Это смещено на один
 Mikael Eriksson06 февр. 2012 г., 07:31
@SohamDasgupta -spt_values пронумерован от 0 до 2047. Если вы не ожидаете, что у вас будет один диапазон дат, превышающий 2047 дней, с вами все будет в порядке. Вы также можете создать собственную таблицу чисел. Было бы хорошо иметь вокруг более одного раза. Убедитесь, что первое число равно 0. Пожалуйста, посмотрите наэта статья Джефф Моден в SQLServerCentral.com
 Mikael Eriksson04 февр. 2012 г., 21:25
@JCooper Нет. Таблица чисел начинается с0 Проверьте ссылку. Это даст ожидаемый результат, начиная сFromDate заканчиваяEndDate.

Ваш ответ на вопрос