Domanda

Sto lavorando su un'applicazione di ricorrenza per eventi. Ho un intervallo di date di esempio, 1 gennaio 2010 al 31 dicembre 2011. Voglio tornare tutti i 3 ° giovedì (arbitrario) del mese, in modo efficiente. Potrei farlo abbastanza banalmente nel codice, l'avvertenza è che deve essere fatto in una stored procedure. In ultima analisi vorrei qualcosa di simile:

CALL return_dates(event_id);

Che event_id ha una start_date di 1/1/2010 e data_finale del 2011/12/31. set di risultati sarebbe qualcosa di simile:

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

Sono solo curioso quale sarebbe il metodo più efficiente di fare questo, considerando che ho potuto finire con un grande set di risultati nel mio effettivo utilizzo.

È stato utile?

Soluzione

Un'idea che viene in mente -. È possibile creare una tabella e memorizzare le date che ti interessa non

Altri suggerimenti

Ok, non l'ho provato, ma penso che il modo più efficace per farlo è tramite una tabella di conteggio, che è una cosa utile da avere nel db in ogni caso:

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

È possibile quindi utilizzare questo per costruire l'intervallo di date tra le due date. E 'veloce, perché solo utilizza l'indice (in realtà spesso più veloce di un ciclo, quindi sono portato a credere)

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

Oltre a ottenere le date di inizio e di fine, il terzo x id ogni mese deve essere compreso tra il 15 e il 21 ° inclusiva. I nomi dei giorni in quella fascia devono essere unici, in modo che possiamo individuare immediatamente.

Se si voleva la seconda DAYNAME, basta modificare l'intervallo in modo appropriato o utilizzare un parametro per calcolarlo.

Si constucts una tabella data utilizzando lo StartDate, e poi l'aggiunta di giorni (tramite l'elenco dei numeri nella tabella conteggio) fino al raggiungimento della data di fine.

Speranza che aiuta!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top