Cómo obtener una tabla de fechas entre xey en SQL Server 2005
-
01-07-2019 - |
Pregunta
Solo quiero una forma rápida (y preferiblemente sin usar un bucle while) de crear una tabla de cada fecha entre la fecha @x y la fecha @y para poder dejar la unión externa a algunas tablas de estadísticas, algunas de las cuales no tendrán registros con certeza. días intermedios, lo que me permite marcar los días faltantes con un 0
Solución
Estrictamente hablando, esto no responde exactamente a tu pregunta, pero es bastante interesante.
Suponiendo que pueda vivir especificando el número de días después de la fecha de inicio, utilizar una expresión de tabla común le proporcionará:
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 )
Otros consejos
Creo que estás buscando esta publicación de blog.
Crearía una tabla de Calendario que contuviera todas las fechas desde una fecha de inicio adecuada hasta una fecha de finalización adecuada.Esto no ocuparía mucho espacio en su base de datos y haría que este tipo de consultas sean un juego de niños.
select ...
from Calendar
left outer join
...
where Calendar.Date >= @x
and Calendar.Date <= @y
Creo que también podrías hacerlo en un bucle while.Sé que es feo, pero es fácil y funciona.
De hecho, estuve haciendo algo similar hace un tiempo, pero no se me ocurrió una forma que no usara un bucle.
Lo mejor que obtuve fue una mesa temporal y luego seleccioné las fechas a las que quería unirme.
El blog al que bduke está vinculado es lindo, aunque creo que la solución de la tabla temporal es quizás una solución más limpia.
Encontré otra tabla que almacena cada fecha (son visitantes del sitio web), entonces, ¿qué tal esto?
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
Depende de que la otra tabla tenga una entrada para cada fecha que quiero, pero hay un 98% de probabilidad de que haya datos para todos los días.
Un ligero giro en la respuesta dada como https://stackoverflow.com/a/95728/395440.Permite especificar días y también calcula el rango hasta la fecha actual.
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 )
Simplemente escribe el bucle.Alguien tiene que escribir un bucle para esto, ya sea usted 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
Justo:DONDE col > fecha de inicio Y col <fecha de finalización