sql >> Base de Datos >  >> RDS >> Sqlserver

Obtenga todas las fechas entre dos fechas en SQL Server

Mi primera sugerencia sería usar su tabla de calendario, si no tiene una, cree una. Son muy útiles. Su consulta es tan simple como:

DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT  Date
FROM    dbo.Calendar
WHERE   Date >= @MinDate
AND     Date < @MaxDate;

Si no quiere o no puede crear una tabla de calendario, aún puede hacerlo sobre la marcha sin un CTE recursivo:

DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

Para leer más sobre esto, consulte:

  • Generar un conjunto o secuencia sin bucles:parte 1
  • Generar un conjunto o secuencia sin bucles:parte 2
  • Generar un conjunto o secuencia sin bucles:parte 3

Con respecto al uso de esta secuencia de fechas en un cursor, realmente recomendaría que busque otra forma. Por lo general, existe una alternativa basada en conjuntos que funcionará mucho mejor.

Así que con tus datos:

  date   | it_cd | qty 
24-04-14 |  i-1  | 10 
26-04-14 |  i-1  | 20

Para obtener la cantidad el 28-04-2014 (que supongo que es su requisito), en realidad no necesita ninguno de los anteriores, simplemente puede usar:

SELECT  TOP 1 date, it_cd, qty 
FROM    T
WHERE   it_cd = 'i-1'
AND     Date <= '20140428'
ORDER BY Date DESC;

Si no lo quiere para un artículo en particular:

SELECT  date, it_cd, qty 
FROM    (   SELECT  date, 
                    it_cd, 
                    qty, 
                    RowNumber = ROW_NUMBER() OVER(PARTITION BY ic_id 
                                                    ORDER BY date DESC)
            FROM    T
            WHERE   Date  <= '20140428'
        ) T
WHERE   RowNumber = 1;