Ottenere le date tra un intervallo di date

Ho bisogno di ottenere tutte le date presenti nell’intervallo di date utilizzando SQL Server 2005

Ecco qui:

DECLARE @DateFrom smalldatetime, @DateTo smalldatetime; SET @DateFrom='20000101'; SET @DateTo='20081231'; ------------------------------- WITH T(date) AS ( SELECT @DateFrom UNION ALL SELECT DateAdd(day,1,T.date) FROM T WHERE T.date < @DateTo ) SELECT date FROM T OPTION (MAXRECURSION 32767); 

Se hai le date in una tabella e vuoi semplicemente selezionare quelle tra due date che puoi usare

 select * from yourTable where yourDate between date1 and date2 

Se vuoi produrre le date dal nulla puoi farlo con un ciclo o puoi compilare una tabella temporanea con le date e poi selezionarla.

 DECLARE @Date1 DATE='2016-12-21', @Date2 DATE='2016-12-25' SELECT DATEADD(DAY,number,@Date1) [Date] FROM master..spt_values WHERE type = 'P' AND DATEADD(DAY,number,@Date1) <= @Date2 

Un po ‘più complicato ma forse più flessibile sarebbe utilizzare una tabella contenente un insieme sequenziale di numeri. Ciò consente più di un intervallo di date con intervalli diversi.

 /* holds a sequential set of number ie 0 to max */ /* where max is the total number of rows expected */ declare @Numbers table ( Number int ) declare @max int declare @cnt int set @cnt = 0 /* this value could be limited if you knew the total rows expected */ set @max = 999 /* we are building the NUMBERS table on the fly */ /* but this could be a proper table in the database */ /* created at the point of first deployment */ while (@cnt <= @max) begin insert into @Numbers select @cnt set @cnt = @cnt + 1 end /* EXAMPLE of creating dates with different intervals */ declare @DateRanges table ( StartDateTime datetime, EndDateTime datetime, Interval int ) /* example set of date ranges */ insert into @DateRanges select '01 Jan 2009', '10 Jan 2009', 1 /* 1 day interval */ union select '01 Feb 2009', '10 Feb 2009', 2 /* 2 day interval */ /* heres the important bit generate the dates */ select StartDateTime from ( select d.StartDateTime as RangeStart, d.EndDateTime as RangeEnd, dateadd(DAY, d.Interval * n.Number, d.StartDateTime) as StartDateTime from @DateRanges d, @Numbers n ) as dates where StartDateTime between RangeStart and RangeEnd order by StartDateTime 

Uso in maniera attenta una variazione di questo per dividere le date in intervalli di tempo (con intervalli diversi ma in genere lunghi 5 minuti). La mia tabella @numbers contiene un massimo di 288 poiché questo è il numero totale di spazi di 5 minuti che puoi avere in un periodo di 24 ore.

 /* EXAMPLE of creating times with different intervals */ delete from @DateRanges /* example set of date ranges */ insert into @DateRanges select '01 Jan 2009 09:00:00', '01 Jan 2009 12:00:00', 30 /* 30 minutes interval */ union select '02 Feb 2009 09:00:00', '02 Feb 2009 10:00:00', 5 /* 5 minutes interval */ /* heres the import bit generate the times */ select StartDateTime, EndDateTime from ( select d.StartDateTime as RangeStart, d.EndDateTime as RangeEnd, dateadd(MINUTE, d.Interval * n.Number, d.StartDateTime) as StartDateTime, dateadd(MINUTE, d.Interval * (n.Number + 1) , StartDateTime) as EndDateTime from @DateRanges d, @Numbers n ) as dates where StartDateTime >= RangeStart and EndDateTime <= RangeEnd order by StartDateTime 

Ecco la versione Oracle della generazione della data:

 SELECT TO_DATE ('01-OCT-2008') + ROWNUM - 1 g_date FROM all_objects WHERE ROWNUM <= 15 

invece di tutti gli oggetti, può essere una qualsiasi tabella con abbastanza righe per coprire l'intervallo richiesto.

Se quello che vuoi è ottenere tutte le date presenti nel tuo database tra due date (es. Quali date hanno ordinato gli utenti nel Q3 del 2008) dovresti scrivere qualcosa del genere:

 select distinct(orderPlacedDate) from orders where orderPlacedDate between '2008-07-01' and 2008-09-30' order by orderPlacedDate 

Per generare un intervallo di date è ansible scrivere una funzione valutata a livello di tabella. Questa è una funzione che crea una dimensione di data per un data warehouse: probabilmente è ansible adattarla abbastanza facilmente eliminando le offerte speciali.

Modifica: qui è senza la gerarchia delle dimensioni della data.

 if object_id ('ods.uf_DateHierarchy') is not null drop function ods.uf_DateHierarchy go create function ods.uf_DateHierarchy ( @DateFrom datetime ,@DateTo datetime ) returns @DateHierarchy table ( DateKey datetime ) as begin declare @today datetime set @today = @Datefrom while @today <= @DateTo begin insert @DateHierarchy (DateKey) values (@today) set @today = dateadd (dd, 1, @today) end return end go