ホームページ >データベース >mysql チュートリアル >SQL Server で複数のゲストの滞在の日付範囲を生成するにはどうすればよいですか?

SQL Server で複数のゲストの滞在の日付範囲を生成するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-10 11:10:42724ブラウズ

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

SQL Server で複数のゲストのチェックイン日の日付範囲を生成するにはどうすればよいですか?

この記事では、滞在中のゲストごとに SQL Server で毎日の記録を生成する効率的な方法を紹介します。タイトルの「SQL Server で日付範囲を生成する方法」とは少し異なり、この方法は各ゲストの毎日のチェックイン レコードを生成することに重点を置いています。これを実現するために、Common Table Expressions (CTE) を使用します。

解決策:

次のクエリは、CTE 関数と ROW_NUMBER() 関数を巧みに組み合わせて、ゲストの滞在全体をカバーする日付シーケンスを生成します。

<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>

結果:

宾客姓名 日期
Bob 2011-07-14
Bob 2011-07-15
Bob 2011-07-16
Bob 2011-07-17

複数のゲストに拡張:

複数のゲストに対応するために、2 番目の CTE を使用して、生成された日付シーケンスでゲスト テーブルを結合できます。

<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>

結果:

宾客姓名 日期
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

以上がSQL Server で複数のゲストの滞在の日付範囲を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。