Heim >Datenbank >MySQL-Tutorial >Wie generiert man effizient Datumsbereiche für mehrere Gäste in SQL Server?
SQL Server-Datumsbereichsgenerierung
Frage:
Obwohl die Eingabeaufforderung die Generierung eines Datumsbereichs beinhaltet, scheint sie sich eher auf die Erstellung einer Tabelle zu konzentrieren, in der jede Zeile jeden Tag des Aufenthalts eines Gastes darstellt. Konkret besteht das Ziel darin, anhand des Namens, des Check-in-Datums und des Check-out-Datums eines Gastes eine Tabelle im folgenden Format zu erstellen:
('Bob', 7/14), ('Bob', 7/15), ('Bob', 7/16), ('Bob', 7/17)
Effiziente Lösung:
Die folgende Abfrage gilt als effiziente Methode für diesen speziellen Zweck und bietet möglicherweise eine bessere Leistung als die Verwendung einer dedizierten Nachschlagetabelle:
<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>
Ergebnis:
客人 | 日期 |
---|---|
Bob | 2011-07-14 |
Bob | 2011-07-15 |
Bob | 2011-07-16 |
Bob | 2011-07-17 |
Sammlungserweiterung:
Diese Technik kann mithilfe der folgenden Abfrage auf einen Datensatz erweitert werden:
<code class="language-sql">DECLARE @t TABLE ( 会员 NVARCHAR(32), 入住日期 DATE, 退房日期 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(入住日期), MAX(退房日期))+1, MIN(入住日期) FROM @t -- WHERE ? ), 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.会员, n.d FROM n CROSS JOIN @t AS t WHERE n.d BETWEEN t.入住日期 AND t.退房日期;</code>
Ergebnis:
会员 | 日期 |
---|---|
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 |
Vereinfacht:
Wie @Dems betonte, kann diese Abfrage weiter vereinfacht werden:
<code class="language-sql">;WITH natural AS ( SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) - 1 AS val FROM sys.all_objects ) SELECT t.会员, d = DATEADD(DAY, natural.val, t.入住日期) FROM @t AS t INNER JOIN natural ON natural.val <= DATEDIFF(DAY, t.入住日期, t.退房日期);</code>
Das obige ist der detaillierte Inhalt vonWie generiert man effizient Datumsbereiche für mehrere Gäste in SQL Server?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!