Heim >Datenbank >MySQL-Tutorial >Wie generiert man effizient einen Datumsbereich für mehrere Gastregistrierungen in SQL Server?

Wie generiert man effizient einen Datumsbereich für mehrere Gastregistrierungen in SQL Server?

Susan Sarandon
Susan SarandonOriginal
2025-01-10 11:56:43595Durchsuche

How to Efficiently Generate a Date Range for Multiple Guest Registrations in SQL Server?

Generieren Sie effizient den Datumsbereich für die Gastregistrierung in SQL Server

Obwohl der Titel des Artikels korrekt ist, vermittelt er nicht vollständig das spezifische Szenario der Generierung einer Zeile für jeden Gast an jedem Tag basierend auf den Check-in- und Check-out-Daten des Gastes. Diese verbesserte Antwort befasst sich mit einer Technik zur Erzielung von Effizienz mithilfe spezieller Nachschlagetabellen.

Verwenden Sie eine spezielle Nachschlagetabelle

Die Lösung mit der Funktion ROW_NUMBER() bietet eine lobenswerte Effizienz für diese spezielle Aufgabe. Die folgende optimierte Abfrage verwendet eine Nachschlagetabelle, um den erforderlichen Datumsbereich zu generieren:

<code class="language-sql">DECLARE @start DATE, @end DATE;
SELECT @start = '20110714', @end = '20110717';

;WITH n AS 
(
  SELECT TOP (DATEDIFF(DAY, @start, @end) + 1)
    n = ROW_NUMBER() OVER (ORDER BY [object_id])
  FROM sys.all_objects
)
SELECT 'Bob', DATEADD(DAY, n-1, @start)
FROM n;</code>

Auf mehrere Gäste erweitern

Um diese Technik auf mehrere Gäste auszudehnen, kann die folgende Abfrage angepasst werden:

<code class="language-sql">DECLARE @t TABLE
(
    Member NVARCHAR(32),
    RegistrationDate DATE,
    CheckoutDate DATE
);

INSERT @t SELECT N'Bob', '20110714', '20110717'
UNION ALL SELECT N'Sam', '20110712', '20110715'
UNION ALL SELECT N'Jim', '20110716', '20110719';

;WITH [range](d,s) AS 
(
  SELECT DATEDIFF(DAY, MIN(RegistrationDate), MAX(CheckoutDate))+1, MIN(RegistrationDate) 
  FROM @t 
),
n(d) AS
(
  SELECT DATEADD(DAY, n-1, (SELECT MIN(s) FROM [range]))
  FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) 
  FROM sys.all_objects) AS s(n)
  WHERE n <= (SELECT d FROM [range])
)
SELECT t.Member, n.d
FROM @t t
INNER JOIN n ON n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;</code>

Diese modifizierte Abfrage generiert effektiv den erforderlichen Datumsbereich für alle Mitglieder in der bereitgestellten Tabelle.

Das obige ist der detaillierte Inhalt vonWie generiert man effizient einen Datumsbereich für mehrere Gastregistrierungen in SQL Server?. 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