Datumsbereich in SQL Server generieren
Während der Titel die Generierung eines Datumsbereichs impliziert, besteht das Hauptproblem darin, mehrere Zeilen für jeden Tag zu erstellen, an dem ein Gast in der Einrichtung übernachtet hat. Ziel ist es, anhand eines Gastnamens, eines Check-in-Datums und eines Check-out-Datums eine Zeile für jeden Tag des Aufenthalts auszugeben.
Die folgende Abfrage löst diese Aufgabe effektiv:
<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>
Das Ausführen dieser Abfrage führt zu den folgenden Ergebnissen (basierend auf dem bereitgestellten Beispiel):
<code>Bob 2011-07-14 Bob 2011-07-15 Bob 2011-07-16 Bob 2011-07-17</code>
Für Situationen, in denen mehrere Gäste untergebracht werden müssen, kann die Abfrage in eine umfassendere Form 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 MAX(d) FROM [range]) ) SELECT t.Member, n.d FROM n CROSS JOIN @t AS t WHERE n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;</code>
Diese angepasste Abfrage liefert die folgenden Ergebnisse, die Daten für mehrere Gäste enthalten:
<code>Member d -------- ---------- Bob 2011-07-14 Bob 2011-07-15 Bob 2011-07-16 Bob 2011-07-17 Sam 2011-07-12 Sam 2011-07-13 Sam 2011-07-14 Sam 2011-07-15 Jim 2011-07-16 Jim 2011-07-17 Jim 2011-07-18 Jim 2011-07-19</code>
Das obige ist der detaillierte Inhalt vonWie erstelle ich einen täglichen Datumsbereich für den Aufenthalt mehrerer Gäste in SQL Server?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!