Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Rufen Sie alle Daten zwischen zwei Daten in SQL Server ab

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;