Heim >Datenbank >MySQL-Tutorial >Wie generiert man effizient einen Datumsbereich für mehrere Gastregistrierungen 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!