2017-09-12 16 views
-1

特定の日付範囲の日付を生成する必要があります。 2010年から2050年まで 私はグーグルで解決策を見つけられませんでした。 SQL Serverを使用して日付範囲をどのように生成できますか。私はストアドプロシージャとブロックを使用しないようにSQLクエリを使用して行う必要があります。 助けていただければ幸いです。 1から始まるSQLサーバーを使用して特定の範囲の日付を生成

おかげ

答えて

1

番号/集計表を作成します(0〜10000の値を持つテーブルを、のは言わせ)は、各番号から日付を計算し、そこから選択し、dbo.Numbersそれを呼び出します、そして何が必要数まで:

SELECT DATEADD(day, n.Number, '2010-01-01') 
FROM dbo.Numbers AS n 
WHERE n < [YourMaxNumberHere] 
0

指定した期間の間の日付を生成するために、再帰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); 
+0

40年は14,310日です - 私はその深い再帰からのスタックフォルトを期待します。 – Brian

+0

@Brian編集、それを15000にしました。私はmaxrecusion(0)で解決策をテストしていませんでした。 –

0

番号を使用しては良いですが、あなたは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 
0

いくつかの数学を助けて、生成日に十分な数を生成することができます。

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 
関連する問題