Pergunta

Estou trabalhando em um aplicativo de recorrência para eventos. Eu tenho um intervalo de data, digamos, 1 de janeiro de 2010 a 31 de dezembro de 2011. Quero devolver todas as 3ª quintas -feiras (arbitrárias) de cada mês, com eficiência. Eu poderia fazer isso bastante trivialmente em código, a ressalva é que devo ser feito em um procedimento armazenado. Em última análise, eu gostaria de algo como:

CALL return_dates(event_id);

Esse evento tem um start_date de 1/1/2010 e end_date de 31/12/2011. Conjunto de resultados seria algo como:

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

Estou apenas curioso para saber qual seria o método mais eficiente de fazer isso, considerando que eu poderia acabar com um conjunto de resultados muito grande no meu uso real.

Foi útil?

Solução

Uma ideia que vem à mente - você pode criar uma tabela e armazenar as datas em que está interessado lá.

Outras dicas

OK, eu não testei, mas acho que a maneira mais eficiente de fazê -lo é através de uma mesa de contagem que é uma coisa útil de qualquer maneira:

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

Você pode usar isso para aumentar o intervalo entre as duas datas. É rápido porque apenas usa o índice (na verdade, muitas vezes mais rápido que um loop, por isso sou levado a acreditar)

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

Além de obter as datas de início e fim, o terceiro X ID a cada mês deve estar entre o dia 15 e o 21º inclusivo. Os nomes do dia nesse intervalo devem ser únicos, para que possamos localizá -lo imediatamente.

Se você deseja o segundo nome do dia, basta modificar o intervalo adequadamente ou usar um parâmetro para calculá -lo.

Ele constitui uma tabela de data usando o StartDate e, em seguida, adicionando dias (através da lista de números na tabela de contagem) até atingir a data de término.

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top