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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top