Como obter uma tabela de datas entre X e Y no sql server 2005
-
01-07-2019 - |
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
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