Heim > Datenbank > MySQL-Tutorial > Wie erstelle ich einen täglichen Datumsbereich für den Aufenthalt mehrerer Gäste in SQL Server?

Wie erstelle ich einen täglichen Datumsbereich für den Aufenthalt mehrerer Gäste in SQL Server?

Patricia Arquette
Freigeben: 2025-01-10 09:46:40
Original
381 Leute haben es durchsucht

How to Generate a Daily Date Range for Multiple Guests' Stays in SQL Server?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage