operaciones - Cómo obtener una tabla de fechas entre x y y en sql server 2005
obtener mes y año de una fecha sql (9)
Creo que estás buscando esta publicación de blog .
Solo quiero una forma rápida (y preferiblemente no usar un bucle while) de crear una tabla de cada fecha entre la fecha @x y la fecha @y para que pueda dejar la combinación externa en algunas tablas de estadísticas, algunas de las cuales no tendrán registros para cierta días en el medio, lo que me permite marcar los días perdidos con un 0
Creo que también podrías hacerlo en un ciclo while. Sé que es feo, pero es fácil y funciona.
Estaba haciendo algo similar hace un tiempo, pero no pude encontrar una forma que no utilizara un loop.
Lo mejor que obtuve fue una tabla temporal, y luego seleccioné las fechas en las que quería unirme a eso.
El blog bduke vinculado es lindo, aunque creo que la solución de tabla temporal es quizás una solución más limpia.
Estrictamente hablando, esto no responde exactamente a su pregunta, pero es bastante limpio.
Asumiendo que puede vivir especificando el número de días después de la fecha de inicio, usar una Expresión de tabla común le brinda:
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 )
He encontrado otra tabla que almacena cada fecha (son los visitantes del sitio web), así que ¿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 deseo, pero es 98% probable que haya datos para cada día.
Justo: DONDE col> fecha de inicio AND col <fecha de finalización
Solo escribe el ciclo. 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
Yo crearía una tabla de Calendario que solo contenía cada fecha 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 estos tipos de consultas sean un juego de niños.
select ...
from Calendar
left outer join
...
where Calendar.Date >= @x
and Calendar.Date <= @y
Un ligero giro en la respuesta dada como https://.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 )