Frage

Ich arbeite an einer Wiederholung Anwendung für Veranstaltungen. Ich habe einen Datumsbereich von etwa 1. Januar 2010 bis zum 31. Dezember 2011. Ich alle des dritten Donnerstags zurückkehren will (willkürlichen) des Monats, effizient. Ich kann dies tun, ziemlich trivial im Code ist der Vorbehalt, dass es muss in einer gespeicherten Prozedur durchgeführt werden. Letztlich will etwas, ich würde wie:

CALL return_dates(event_id);

hat Das event_id eine start_date 1.1.2010 und end_date von 2011.12.31. Ergebnismenge wäre so etwas wie:

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

Ich bin nur neugierig, was die effizienteste Methode, dies zu tun wäre, wenn man bedenkt, ich könnte mit einer sehr großen Ergebnismenge in meiner tatsächlichen Nutzung enden.

War es hilfreich?

Lösung

Eine Idee, die in den Sinn kommt -. Sie eine Tabelle erstellen und speichern die Daten, die Sie dort interessiert sind

Andere Tipps

Ok, ich habe getestet es nicht, aber ich denke, der effizienteste Weg, es zu tun über eine Tally-Tabelle ist, die eine nützliche Sache ist in der db hat sowieso:

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);

Sie können dann diese verwenden Sie den Datumsbereich zwischen den beiden Daten aufzubauen. Es ist schnell, weil es nutzt nur den Index (in der Tat oft schneller als eine Schleife, so führte ich bin zu glauben)

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>'

Neben immer die Start- und Enddaten, die dritte x id jeden Monat muss zwischen dem 15. und 21. integrativ sein. Der Tag-Name in diesem Bereich eindeutig sein muß, so dass wir es sofort finden können.

Wenn Sie die zweite dayname, nur ändern Sie den Bereich entsprechend oder verwenden Sie einen Parameter, es berechnen wollte.

Es constucts ein Datum Tabelle mit dem Startdatum, und dann Zugabe Tagen auf (über die Liste der Zahlen in der Tally-Tabelle), bis er das Enddatum erreicht.

Hope, es hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top