Heim >Datenbank >MySQL-Tutorial >Wie kann ich einen Datumsbereich in SQL Server effizient abrufen?

Wie kann ich einen Datumsbereich in SQL Server effizient abrufen?

DDD
DDDOriginal
2025-01-12 11:22:42358Durchsuche

How to Efficiently Retrieve a Date Range in SQL Server?

Alle Daten zwischen zwei bestimmten Daten in SQL Server abrufen

Anforderungen

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.

Herausforderung

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.

Lösung

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>

Vermeiden Sie die Verwendung von Cursorn

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn