現在の日付から各レコードの日付をリストする 61 レコードのテーブルを返すクエリを作成する方法を見つけようとしています。
2990 次
5 に答える
2
SQL-Server で 61 の日付のリストを取得する最も簡単で、おそらく最も効率的な方法は、システム テーブル Master.dbo.spt_values を使用することです。
SELECT [Date] = DATEADD(DAY, number - 30, CAST(CURRENT_TIMESTAMP AS DATE))
FROM Master..spt_values
WHERE Type = 'P'
AND Number <= 60;
編集
文書化されていないシステム テーブルの使用が心配な場合は、これで同じことが行われます (ここでもループは発生しません)。
WITH T AS
( SELECT Number = ROW_NUMBER() OVER(ORDER BY Object_ID)
FROM sys.all_objects
)
SELECT [Date] = DATEADD(DAY, number - 30, CAST(CURRENT_TIMESTAMP AS DATE))
FROM T
WHERE Number <= 60;
ここでは、一連の数列を生成するさまざまな方法のメリットについて、広範なテストが行われています。私の好みのオプションは、常に独自のテーブルです (例: dbo.numbers、またはこの場合はカレンダー テーブル)。
于 2013-05-02T18:01:58.123 に答える
1
これを試して
;with DateList As
(
select GETDATE() as DateCol
union all
select datecol + 1 from datelist
where DateDiff(d, getdate(),datecol+1) < 31 and DateCol + 1 > GETDATE()
union all
select datecol - 1 from datelist
where DateDiff(d, datecol-1, getdate()) < 31 and DateCol - 1 < GETDATE()
)
select CONVERT(varchar(15), DateCol, 101) DateCol from DateList
order by 1
OPTION (MAXRECURSION 0)
他のテーブルに参加したい場合
declare @t table (code varchar(10));
insert into @t
values ('a'), ('b')
;with DateList As
(
select GETDATE() as DateCol
union all
select datecol + 1 from datelist
where DateDiff(d, getdate(),datecol+1) < 31 and DateCol + 1 > GETDATE()
union all
select datecol - 1 from datelist
where DateDiff(d, datecol-1, getdate()) < 31 and DateCol - 1 < GETDATE()
)
select * from DateList, @t
OPTION (MAXRECURSION 0)
于 2013-05-02T17:55:00.143 に答える
1
私の意見では、これにアプローチする最善の方法は、再帰的な ctes、一時テーブル、またはシステム テーブルを使用するのではなく、日付ルックアップ テーブルを作成して再利用することです。ルックアップ テーブルを一度作成すると、必要に応じて使用できます。
そこから、日付のリストを生成するのは非常に簡単です。
select *
from datelookup
where datefull >= dateadd(day,-30,convert(varchar(10), getDate(), 120))
and datefull <= dateadd(day,30,convert(varchar(10), getDate(), 120));
SQL Fiddle Demo (このようなテーブルを作成するためのサンプル コードが含まれています)
于 2013-05-02T18:30:59.720 に答える