Heim >Datenbank >MySQL-Tutorial >Wie generiert man effizient Datumsbereiche für mehrere Gäste in SQL Server?

Wie generiert man effizient Datumsbereiche für mehrere Gäste in SQL Server?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-10 11:52:41808Durchsuche

How to Efficiently Generate Date Ranges for Multiple Guests 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!

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