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

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

Susan Sarandon
Susan Sarandonオリジナル
2025-01-10 11:56:43557ブラウズ

How to Efficiently Generate a Date Range for Multiple Guest Registrations in SQL Server?

SQL Server でゲスト登録の日付範囲を効率的に生成する

記事のタイトルは正確ですが、ゲストのチェックイン日とチェックアウト日に基づいて毎日各ゲストの行を生成するという具体的なシナリオを完全には伝えていません。この改善された応答では、特殊なルックアップ テーブルを使用して効率を達成する手法を詳しく掘り下げます。

専用のルックアップテーブルを使用する

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>

複数のゲストに拡張

この手法を複数のゲストに拡張するには、次のクエリを適用できます:

<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 d FROM [range])
)
SELECT t.Member, n.d
FROM @t t
INNER JOIN n ON n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;</code>

この変更されたクエリは、提供されたテーブル内のすべてのメンバーに必要な日付範囲を効果的に生成します。

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

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