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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top