Mein erster Vorschlag wäre, Ihre Kalendertabelle zu verwenden, wenn Sie keine haben, dann erstellen Sie eine. Sie sind sehr nützlich. Ihre Abfrage ist dann so einfach wie:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
Wenn Sie keine Kalendertabelle erstellen möchten oder können, können Sie dies immer noch ohne rekursiven CTE tun:
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;
Weitere Informationen hierzu finden Sie unter:
- Erzeuge ein Set oder eine Sequenz ohne Schleifen – Teil 1
- Erzeuge ein Set oder eine Sequenz ohne Schleifen – Teil 2
- Erzeuge ein Set oder eine Sequenz ohne Schleifen – Teil 3
In Bezug auf die Verwendung dieser Datumsfolge in einem Cursor würde ich Ihnen wirklich empfehlen, einen anderen Weg zu finden. Normalerweise gibt es eine satzbasierte Alternative, die viel besser abschneidet.
Also mit Ihren Daten:
date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
Um die Menge am 28.04.2014 zu erhalten (was meiner Meinung nach Ihre Anforderung ist), benötigen Sie eigentlich keines der oben genannten, Sie können einfach verwenden:
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
Wenn Sie es für einen bestimmten Artikel nicht möchten:
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;