Heim >Datenbank >MySQL-Tutorial >Wie kann ich einen Datumsbereich in SQL Server effizient abrufen?
Das Ziel besteht darin, eine vollständige Liste aller Daten in einem bestimmten Bereich vom Startdatum bis zum Enddatum zu erhalten. Diese Informationen werden zur späteren Verarbeitung im Cursor gespeichert.
Um diese Aufgabe zu erfüllen, wird eine Abfrage mithilfe eines rekursiven Common Table Expression (CTE) implementiert:
<code class="language-sql">;with GetDates As ( select DATEADD(day,1,@maxDate) as TheDate UNION ALL select DATEADD(day,1, TheDate) from GetDates where TheDate < @minDate ) SELECT TheDate FROM GetDates</code>
Beim Versuch, den Cursor mit den CTE-Ergebnissen zu füllen, ist jedoch ein Fehler aufgetreten:
<code class="language-sql">SET @DateCurSor = CURSOR FOR SELECT TheDate FROM GetDates</code>
In der Fehlermeldung wird ein Syntaxfehler in der Nähe des Schlüsselworts „SET“ angegeben.
Eine andere Methode wird empfohlen, nämlich die Verwendung eines Kalenders. Wenn die Kalendertabelle nicht vorhanden ist, kann sie einfach erstellt werden. Diese Tabelle bietet eine tabellarische Darstellung der Daten und vereinfacht so den Abrufvorgang erheblich.
<code class="language-sql">DECLARE @MinDate DATE = '20140101', @MaxDate DATE = '20140106'; SELECT Date FROM dbo.Calendar WHERE Date >= @MinDate AND Date <= @MaxDate;</code>
Wenn keine Kalendertabelle vorhanden ist, bietet sich ein einfaches Verfahren unter Einbeziehung der Systemtabelle sys.all_objects an:
<code class="language-sql">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;</code>
Die Verwendung von Cursorn in SQL Server wird im Allgemeinen nicht empfohlen. Im Gegensatz dazu erfreuen sich satzbasierte Operationen aufgrund ihrer überlegenen Leistung größerer Beliebtheit. Im beschriebenen Szenario kann die Aufgabe, die Menge eines bestimmten Artikels zu einem bestimmten Datum zu ermitteln, ohne Verwendung von Cursorn gelöst werden:
<code class="language-sql">SELECT TOP 1 date, it_cd, qty FROM T WHERE it_cd = 'i-1' AND Date BETWEEN @MinDate AND @MaxDate;</code>
Das obige ist der detaillierte Inhalt vonWie kann ich einen Datumsbereich in SQL Server effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!