0

将来の日付のテーブルを作成しようとしています。while ループを使用すると簡単に実行できますが、これが SQL で最も効率的な方法ではないことはわかっています。だから私は誰かがSQLセットベースの方法でこれを行う方法についていくつかのアイデアを共有できることを望んでいました.

これが私のコードです:

declare @count int, @dd date
set @count=0;
set @dd ='01/04/2013';
while (@count<24)
  begin
    select @dd=dateadd(week, 2,@dd);
    set @count=@count+1;
    select @dd
  end

前もって感謝します...

4

2 に答える 2

1

おそらくこれを行う最善の方法は、固定カレンダー テーブルを使用することです。日付ロジックの処理に必要なすべてのビジネス ルールを含む永続的なテーブルを作成してください。

回避策として、次のようなことができます (データベースに 24 を超える列があると仮定します)。

DECLARE @dd DATE
SET @dd = '01/04/2013';

SELECT TOP 24 DATEADD(week, 2*rn, @dd) 
FROM (SELECT rn=(ROW_NUMBER() OVER (ORDER BY name)) -1
        FROM sys.columns) c
于 2013-07-29T16:22:12.513 に答える
0

データ ウェアハウスでも同様のことを行います。二段階の手術です。1 つは主キー フィールドのみを含む新しいレコードを追加する方法で、もう 1 つは新しいレコードの他のフィールドを更新する方法です。データベース エンジンは redbrick です。redbrick の構文は、SQL サーバーの構文に似ています。

これは挿入クエリです。

insert into period (date)

select
    case when days_in_year((select max(date) from period))=365 -- current max year not leap year
    and days_in_year(dateadd(day,1,(select max(date) from period)))=365 --new year not leap year
    then dateadd(day,365,date)
    else dateadd(day,366,date)end

from period

where date between
    case when days_in_year(dateadd(day,1,(select max(date) from period)))=366 -- new year is leap year
    or days_in_year((select max(date) from period))=366 -- current max year is leap year
            then dateadd(day,-365, (select max(date) from period)) -- Dec 31 of year before current max year
            else dateadd(day,-364, (select max(date) from period)) end --Jan 1 of current max year

and

    case when days_in_year((select max(date) from period))=366 -- current max year is leap year
            then dateadd(day,-1, (select max(date) from period))-- Dec 30 of current max year
            else (select max(date) from period) end -- Dec 31 of current max year

and current_date > dateadd(month,-9,(select max(date) from period))

days_in_year は redbrick マクロであることに注意してください。この場合、SQL サーバーのユーザー定義関数と同等です。この赤レンガコードに相当します

extract(dayofyear from date(concat(datename(year,%1),'-12-31')))

ここで、%1 はマクロに渡される引数です。

于 2013-07-29T16:41:47.990 に答える