Question

Je travaille sur une application de récurrence des événements. J'ai une plage de dates de dire, 1 2010 au 31 Décembre Janvier 2011. Je veux retourner tous les 3e jeudis (arbitraires) de chaque mois, de manière efficace. Je pouvais faire ce joli trivialement dans le code, la mise en garde est que doit être fait dans une procédure stockée. En fin de compte je veux quelque chose comme:

CALL return_dates(event_id);

Ce event_id a une start_date de 1/1/2010 et date_fin de 12/31/2011. Le jeu de résultats serait quelque chose comme:

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

Je suis juste curieux de ce que la méthode la plus efficace de le faire serait, étant donné que je pourrais finir avec un très grand jeu de résultats dans mon utilisation réelle.

Était-ce utile?

La solution

Une idée qui vient à l'esprit -. Vous pouvez créer une table et stocker les dates qui vous intéressent là

Autres conseils

Ok, je ne l'ai pas testé, mais je pense que la façon la plus efficace de le faire est par le biais d'une table de pointage qui est une chose utile d'avoir dans les db de toute façon:

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

Vous pouvez alors l'utiliser pour construire la plage de dates entre les deux dates. Il est rapide, car il utilise simplement l'indice (en fait souvent plus rapide qu'une boucle, donc je suis amené à croire)

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

En plus d'obtenir les dates de début et de fin, le troisième id x chaque mois doit être comprise entre le 15 et le 21 inclus. Les noms de jour dans cette gamme doit être unique, afin que nous puissions le trouver tout de suite.

Si vous voulez que le deuxième DAYNAME, il suffit de modifier la plage appropriée ou utiliser un paramètre pour le calculer.

Il constucts une table de date à l'aide du startdate, puis en ajoutant jours (via la liste des numéros dans le tableau de pointage) jusqu'à la date de fin.

it helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top