特定の日付範囲の日付を生成する必要があります。 2010年から2050年まで 私はグーグルで解決策を見つけられませんでした。 SQL Serverを使用して日付範囲をどのように生成できますか。私はストアドプロシージャとブロックを使用しないようにSQLクエリを使用して行う必要があります。 助けていただければ幸いです。 1から始まるSQLサーバーを使用して特定の範囲の日付を生成
おかげ
特定の日付範囲の日付を生成する必要があります。 2010年から2050年まで 私はグーグルで解決策を見つけられませんでした。 SQL Serverを使用して日付範囲をどのように生成できますか。私はストアドプロシージャとブロックを使用しないようにSQLクエリを使用して行う必要があります。 助けていただければ幸いです。 1から始まるSQLサーバーを使用して特定の範囲の日付を生成
おかげ
番号/集計表を作成します(0〜10000の値を持つテーブルを、のは言わせ)は、各番号から日付を計算し、そこから選択し、dbo.Numbersそれを呼び出します、そして何が必要数まで:
SELECT DATEADD(day, n.Number, '2010-01-01')
FROM dbo.Numbers AS n
WHERE n < [YourMaxNumberHere]
指定した期間の間の日付を生成するために、再帰CTEを使用することができますが、それはより速く、より複雑でない解決策になることができcalendarテーブルを使用することをお勧めします。限られた日付範囲と
デモ - http://rextester.com/XXUVO70452
Declare @StartDate as DATE = '2010-01-01'
,@EndDate as DATE = '2050-12-31'
;WITH DateRange As
(
SELECT @StartDate as N
UNION ALL
SELECT DATEADD(DAY, 1, N)
FROM DateRange
WHERE DATEADD(DAY, 1, N) < @EndDate
)
SELECT * From DateRange OPTION (MAXRECURSION 15000);
番号を使用しては良いですが、あなたはDBオブジェクトを作成する必要があります。あなたはまた、簡単なテーブル変数とWHILEループ
DECLARE @tbl TABLE(
DateValue DATETIME
)
DECLARE @startDate DATETIME = '2010-01-01'
DECLARE @endDate DATETIME = '2050-01-01'
DECLARE @seqDays INT;
SELECT @seqDays = DATEDIFF(d, @startDate,@endDate)
DECLARE @val INT = 1
WHILE(@val <= @seqDays)
BEGIN
INSERT INTO @tbl VALUES(DATEADD(day, @val, @startDate))
SET @val = @val + 1
END
SELECT * FROM @tbl
それとも@Dymengで別の答えで説明した数値テーブルオプションのを使用することができ、あなた自身のテーブル変数を作成し、それに参加することができます。あなたもSEQUENCEを使用することができましたが、それはより簡単なことのためには行き過ぎになるでしょう。
DECLARE @tbl TABLE(
DateValue DATETIME
)
DECLARE @startDate DATETIME = '2010-01-01'
DECLARE @endDate DATETIME = '2050-01-01'
DECLARE @seqDays INT;
SELECT @seqDays = DATEDIFF(d, @startDate,@endDate)
DECLARE @tbl TABLE(
DateInc INT IDENTITY(1,1)
)
DECLARE @val INT = 1
WHILE(@val <= @seqDays)
BEGIN
INSERT INTO @tbl DEFAULT VALUES
SET @val= @val + 1
END
SELECT DATEADD(day, a.DateValue, @startDate) FROM @tbl a
いくつかの数学を助けて、生成日に十分な数を生成することができます。
DECLARE @BeginDate DATETIME ='20100101'
DECLARE @EndDate DATETIME ='20500101'
DECLARE @Day INT = DATEDIFF(DAY, @BeginDate, @EndDate);
DECLARE @P INT = FLOOR(LOG(@Day, 2))
;WITH Base AS (SELECT * FROM (VALUES(1),(2)) N (ID))
,Numbers AS (
SELECT 1 I FROM Base
UNION ALL
SELECT I+1 AS I FROM Base CROSS JOIN Numbers WHERE I < @P
)
, DateRange AS
(
SELECT DATEADD(DAY, ROW_NUMBER() OVER(Order BY I), @BeginDate) DateValue FROM Numbers
)
SELECT * FROM DateRange WHERE DateValue < @EndDate
40年は14,310日です - 私はその深い再帰からのスタックフォルトを期待します。 – Brian
@Brian編集、それを15000にしました。私はmaxrecusion(0)で解決策をテストしていませんでした。 –