Esta es el arreglo más válida que te podemos brindar, pero mírala detenidamente y analiza si es compatible a tu trabajo.
Solución:
Mi primera sugerencia sería usar su tabla de calendario, si no tiene una, cree una. Son muy útiles. Entonces, 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 desea 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 obtener más información sobre esto, consulte:
- Genere 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 a luego usar esta secuencia de fechas en un cursor, realmente te recomiendo que encuentres otra forma. Por lo general, existe una alternativa basada en conjuntos que funcionará mucho mejor.
Entonces 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 según entiendo 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 desea 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;
Puede utilizar este script para buscar fechas entre dos fechas. Referencia extraída de este artículo:
DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME
SET @StartDateTime = '2015-01-01'
SET @EndDateTime = '2015-01-12';
WITH DateRange(DateData) AS
(
SELECT @StartDateTime as Date
UNION ALL
SELECT DATEADD(d,1,DateData)
FROM DateRange
WHERE DateData < @EndDateTime
)
SELECT DateData
FROM DateRange
OPTION (MAXRECURSION 0)
GO
Cree fácilmente una función de valor de tabla que devolverá una tabla con todas las fechas.
Ingrese fechas como string
Puede personalizar la fecha en el formato que desee '01 / 01/2017 'o '01-01-2017' en string formatos (103.126 ...)
Prueba esto
CREATE FUNCTION [dbo].[DateRange_To_Table] ( @minDate_Str NVARCHAR(30), @maxDate_Str NVARCHAR(30))
RETURNS @Result TABLE(DateString NVARCHAR(30) NOT NULL, DateNameString NVARCHAR(30) NOT NULL)
AS
begin
DECLARE @minDate DATETIME, @maxDate DATETIME
SET @minDate = CONVERT(Datetime, @minDate_Str,103)
SET @maxDate = CONVERT(Datetime, @maxDate_Str,103)
INSERT INTO @Result(DateString, DateNameString )
SELECT CONVERT(NVARCHAR(10),@minDate,103), CONVERT(NVARCHAR(30),DATENAME(dw,@minDate))
WHILE @maxDate > @minDate
BEGIN
SET @minDate = (SELECT DATEADD(dd,1,@minDate))
INSERT INTO @Result(DateString, DateNameString )
SELECT CONVERT(NVARCHAR(10),@minDate,103), CONVERT(NVARCHAR(30),DATENAME(dw,@minDate))
END
return
end
Para ejecutar la función haga esto:
SELECT * FROM dbo.DateRange_To_Table ('01/01/2017','31/01/2017')
La salida será
01/01/2017 Sunday
02/01/2017 Monday
03/01/2017 Tuesday
04/01/2017 Wednesday
05/01/2017 Thursday
06/01/2017 Friday
07/01/2017 Saturday
08/01/2017 Sunday
09/01/2017 Monday
10/01/2017 Tuesday
11/01/2017 Wednesday
12/01/2017 Thursday
13/01/2017 Friday
14/01/2017 Saturday
15/01/2017 Sunday
16/01/2017 Monday
17/01/2017 Tuesday
18/01/2017 Wednesday
19/01/2017 Thursday
20/01/2017 Friday
21/01/2017 Saturday
22/01/2017 Sunday
23/01/2017 Monday
24/01/2017 Tuesday
25/01/2017 Wednesday
26/01/2017 Thursday
27/01/2017 Friday
28/01/2017 Saturday
29/01/2017 Sunday
30/01/2017 Monday
31/01/2017 Tuesday
Reseñas y calificaciones de la guía
Si crees que ha sido útil este post, agradeceríamos que lo compartas con otros entusiastas de la programación de este modo nos ayudas a difundir nuestro contenido.