Come ottenere una tabella di date tra x e y in sql server 2005
-
01-07-2019 - |
Domanda
Voglio solo un modo rapido (e possibilmente non utilizzando un ciclo while)di createing una tavola di ogni data compresa tra la data di @x e la data @y in modo che posso left outer join alcune statistiche tabelle, alcuni dei quali hanno nessun record per alcuni giorni tra, che mi permette di mark giorni mancanti con un 0
Soluzione
Strettamente parlando, questo non risponde esattamente alla tua domanda, ma la sua abbastanza carino.
Supponendo che si può vivere con indicazione del numero di giorni dopo la data di inizio, poi con un'Espressione di Tabella Comune ti offre:
WITH numbers ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM numbers WHERE n < 500 )
SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers
OPTION ( MAXRECURSION 500 )
Altri suggerimenti
Credo che stai cercando questo post del blog.
Vorrei creare una tabella di Calendario che contenevano solo ogni data da un data di inizio fino a un adeguato data di fine.Questo non occupano molto spazio nel vostro database e vorrei fare questi tipi di query in un gioco da bambini.
select ...
from Calendar
left outer join
...
where Calendar.Date >= @x
and Calendar.Date <= @y
Penso che si potrebbe anche solo farlo in un ciclo while.Lo so che è brutto, ma è semplice e funziona.
Mi è stato effettivamente facendo qualcosa di simile un po ' indietro, ma non riuscivo a trovare un modo che non utilizzo di un ciclo.
Il migliore che ho ottenuto è stato una tabella temporanea, e quindi selezionando le date io voglio entrare in quel.
Il blog bduke collegato è carino, anche se credo che la tabella temporanea soluzione è forse una soluzione di pulitura.
Ho trovato un'altra tabella che memorizza ogni data (e ' visitatori del sito web), così come su questo...
Declare @FromDate datetime,
@ToDate datetime
Declare @tmpDates table
(StatsDate datetime)
Set @FromDate = DateAdd(day,-30,GetDate())
Set @ToDate = GetDate()
Insert Into @tmpDates (StatsDate)
Select
distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
FROM tbl_visitorstats
Where visitDate between @FromDate And @ToDate
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
Select * FROM @tmpDates
Non fare affidamento sull'altro tavolo con una voce per ogni data voglio, ma il 98% di probabilità ci saranno di dati per ogni giorno.
Una leggera torsione della risposta che come https://stackoverflow.com/a/95728/395440.Permette di giorni per essere specificati e calcola anche la gamma fino a data corrente.
DECLARE @startDate datetime
SET @startDate = '2015/5/29';
WITH number ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE()) )
SELECT DATEADD(day,n-1,@startDate) FROM number where
datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
OPTION ( MAXRECURSION 500 )
Basta scrivere il loop.Qualcuno deve scrivere un ciclo per questo, che sia tu o SQL Server.
DECLARE @Dates TABLE
(
TheDate datetime PRIMARY KEY
)
DECLARE @StartDate datetime, @EndDate datetime
SELECT @StartDate = '2000-01-01', @EndDate = '2010-01-01'
DECLARE @LoopVar int, @LoopEnd int
SELECT @LoopEnd = DateDiff(dd, @StartDate, @EndDate), @LoopVar = 0
WHILE @LoopVar <= @LoopEnd
BEGIN
INSERT INTO @Dates (TheDate)
SELECT DateAdd(dd,@LoopVar,@StartDate)
SET @LoopVar = @LoopVar + 1
END
SELECT *
FROM @Dates
Solo:DOVE col > inizio-data E col < data di fine