質問

私はイベントのために再発アプリケーションに取り組んでいます。私は効率的に、各月の第3木曜日(任意)のすべてを返すようにしたい12月31日、2011年に言うの日付範囲、2010年1月1日を持っています。私はコード内でかなり自明これを行うことが、注意すべき点は、のストアドプロシージャに行われなければならないということです。最終的には私のような何かをしたいと思います:

CALL return_dates(event_id);
それのevent_idは、2010年1月1日と2011年12月31日のEND_DATEのSTART_DATEを持っています。結果セットのようなものになります:

1/20/2010
2/14/2010
3/17/2010
4/16/2010
5/18/2010
etc. 

Iこれを行うための最も効率的な方法は、私は私の実際の使用では非常に大きな結果セットで終わるかもしれない考えると、どうなるか興味があるだけだ。

役に立ちましたか?

解決

心に来るひとつのアイデア - 。あなたは、テーブルを作成し、そこに興味を持っている日付を格納することができます。

他のヒント

[OK]を、私はそれをテストしていませんが、私はそれを行うための最も効率的な方法はとにかくデシベルにあると便利なものである集計テーブルを経由していると思います:

IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[num_seq]') AND type in (N'U'))
DROP TABLE [dbo].[num_seq];

SELECT TOP 100000 IDENTITY(int,1,1) AS n
INTO num_seq
FROM MASTER..spt_values a, MASTER..spt_values b;

CREATE UNIQUE CLUSTERED INDEX idx_1 ON num_seq(n);

あなたは、2つの日付の間の日付の範囲を構築するためにこれを使用することができます。それは速いためです (私は信じるように導かてるので、ループよりも頻繁に速く、実際に)それだけでインデックスを使用しています。

create procedure getDates
    @eventId int
AS
begin

declare @startdate datetime
declare @enddate datetime

--- get the start and end date, plus the start of the month with the start date in
select @startdate=startdate, 
       @enddate=enddate
       from events where eventId=@eventId

  select
         @startdate+n AS date,
       from
         dbo.num_seq tally
       where
        tally.n<datediff(@monthstart, @enddate) and
        Datepart(dd,@startdate+n) between 15 and 21 and
        Datepart(dw, @startdate+n) = '<day>'

は別に、開始日と終了日を取得してから、第三のxのIDは、各月の15日と21日の範囲でなければなりません。 我々はすぐにそれを見つけることができますので、その範囲での曜日名は、一意である必要があります。

あなたが二DAYNAMEを望んでいた場合は、単に適切な範囲を変更したり、それを計算するためにパラメータを使用します。

これはSTARTDATEを使用して日付テーブルをconstucts、そしてそれは終了日に達するまで(集計テーブル内の番号のリストを介して)に日を追加する。

希望、それが役立ちます!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top