Pregunta

Estoy trabajando en una aplicación de recurrencia de eventos. Tengo un intervalo de fechas de, por ejemplo, 1º de enero de 2010 al 31 de diciembre de 2011. Quiero devolver todos los jueves (3ª arbitrarias) del cada mes, de manera eficiente. Yo podría hacer esto bastante trivial en el código, la advertencia es que debe se realiza en un procedimiento almacenado. En última instancia me gustaría algo como:

CALL return_dates(event_id);

Eso event_id tiene una fecha_inicial de 1/1/2010 y fecha_final del 12/31/2011. conjunto de resultados sería algo como:

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

tengo curiosidad ¿cuál sería el método más eficiente de hacerlo, teniendo en cuenta que podría terminar con un gran conjunto de resultados en mi uso real.

¿Fue útil?

Solución

Una idea que viene a la mente -. Puede crear una tabla y almacenar las fechas que le interesa no

Otros consejos

Ok, no he probado, pero creo que la forma más eficaz de hacerlo es a través de una tabla de conteo que es una cosa útil tener en el PP de todas formas:

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

A continuación, se puede usar esto para construir el intervalo de fechas entre las dos fechas. Es rápido, porque sólo se utiliza el índice (de hecho a menudo más rápido que un bucle, por lo que tengo entendido que)

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

Aparte de conseguir las fechas de inicio y fin, la tercera x Identificación cada mes debe estar entre el 15 y el 21 inclusive. Los nombres de los días en ese rango deben ser únicos, por lo que podemos localizar inmediatamente.

Si quería el segundo nombre del día, basta con modificar la gama apropiada o utilizar un parámetro para calcularlo.

constucts una mesa fecha usando el startdate y, a continuación, la adición de días en (a través de la lista de números en la tabla de conteo) hasta que alcanza la fecha de finalización.

Hope que ayuda!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top