Вставьте серию дат в sql startdate и enddate

Я работаю над оператором SQL, в котором я могу выбрать дату начала и дату окончания и добавить все даты между ними в таблицу. Эта дата начала и окончания сопровождается идентификатором. Например, я выбираю 01.01.2012 и 01.04.2012, а идентификатор равен 1, результат должен быть следующим

reqId   reqDate
1       1/1/2012
1       2/1/2012
1       3/1/2012
1       4/1/2012

Мой оператор sql выглядит следующим образом

"Insert into Request(reqId, reqDate) " & _
"Select @request, reqDate From Request where reqDate between @start and @end "

Он просто ничего не делает, поэтому я не уверен, что я на правильном пути.


person Louis Lam    schedule 04.07.2012    source источник
comment
Каким образом ваше волшебное выдуманное утверждение должно знать, что вам нужны ежедневные интервалы, а не, скажем, ежечасные или еженедельные? Кроме того, что RDBMS?   -  person Damien_The_Unbeliever    schedule 04.07.2012
comment
Я читал о разных методах для них, но безрезультатно   -  person Louis Lam    schedule 04.07.2012


Ответы (1)


Не зная, какую систему базы данных вы используете, вот одна из них для SQL Server (2008 или более поздней версии):

declare @Start date
declare @end date
declare @request int

set @Start = '20120101'
set @end = '20120104'
set @request = 1

;with Dates as (
    select @request as reqId,@Start as reqDate
    union all
    select reqId+1,DATEADD(day,1,reqDate) from Dates
    where reqDate < @end
)
select * from Dates

Результат:

reqId       reqDate
----------- ----------
1           2012-01-01
2           2012-01-02
3           2012-01-03
4           2012-01-04

(Первоначально я сказал для 2005 года или позже, но потом понял, что использую date. Для 2005 года замените date на datetime)

person Damien_The_Unbeliever    schedule 04.07.2012
comment
Я на самом деле использую Visual Studio 2008. - person Louis Lam; 04.07.2012
comment
Visual Studio не является системой баз данных, но большинство очевидных способов подключения к базе данных из нее подключатся к SQL Server (Express или Compact). - person Damien_The_Unbeliever; 04.07.2012
comment
Извините, я на самом деле нуб в программировании SQL. Есть ли другие способы, такие как использование цикла While? Я пытался изменить ваш код, но безрезультатно. - person Louis Lam; 04.07.2012
comment
@LouisLam - люди, плохо знакомые с SQL, часто ищут циклы и удивляются, что не находят их. Это связано с тем, что SQL задуман как язык, основанный на наборах, где вы описываете общий результат, а SQL вычисляет все это за один раз. На самом деле в моем ответе есть что-то немного похожее на цикл — A Рекурсивное общее табличное выражение (CTE) - person Damien_The_Unbeliever; 04.07.2012