3 ° del Mese - MySQL
-
25-09-2019 - |
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.
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!