Pergunta

Eu só quero uma maneira rápida (e de preferência não usando um loop while) de createing uma tabela de cada data entre @x data e data @y para que eu possa deixou junção externa para algumas tabelas estatísticas, alguns dos quais não terão registros para alguns dias no meio, permitindo-me para marcar dias faltando com um 0

Foi útil?

Solução

Estritamente falando, isso não responde exatamente a sua pergunta, mas a sua muito arrumado.

Assumindo que você pode viver com especificando o número de dias após a data de início, em seguida, usando uma expressão de tabela comum dá-lhe:

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 )

Outras dicas

Eu acredito que você está procurando este post .

Gostaria de criar uma tabela de calendário que apenas continha cada data a partir da data de início adequado até uma data final adequado. Isso não ocupam muito espaço em seu banco de dados e gostaria de fazer esses tipos de jogo consulta da criança.

select  ...
from    Calendar
        left outer join
        ...
where   Calendar.Date >= @x
and     Calendar.Date <= @y

Eu acho que você pode muito bem fazê-lo em um loop while. Eu sei que é feio, mas é fácil e ele funciona.

Eu estava realmente fazendo algo semelhante um pouco para trás, mas eu não poderia vir acima com uma maneira que não usar um loop.

O melhor que consegui foi uma tabela temporária, em seguida, selecionando as datas que eu queria juntar-se em para isso.

O blog bduke ligada a é bonito, embora eu acho que a solução tabela temporária é talvez uma solução mais limpa.

Eu encontrei outra tabela que armazena todos os data (é visitantes do website), assim como sobre isso ...

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

Ele se baseia na outra mesa tendo uma entrada para cada data que eu quero, mas é 98% provavelmente não haverá dados para cada dia.

Uma leve torção no resposta dada como https://stackoverflow.com/a/95728/395440 . Permite dias para ser especificado e também calcula variar até a data atual.

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 escrever o loop. Alguém tem que escrever um loop para isso, seja ele você -. Ou 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

Apenas: WHERE col> start-date e Col

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top