ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。