1

現在の日付から各レコードの日付をリストする 61 レコードのテーブルを返すクエリを作成する方法を見つけようとしています。

4

5 に答える 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;

SQL Fiddle の例


編集

文書化されていないシステム テーブルの使用が心配な場合は、これで同じことが行われます (ここでもループは発生しません)。

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;

SQL Fiddle の例

ここでは、一連の数列を生成するさまざまな方法のメリットについて、広範なテストが行​​われています。私の好みのオプションは、常に独自のテーブルです (例: 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 に答える