SQL Server の日付範囲の取得テクニック
課題: 指定された範囲内の一連の日付を効率的に取得し、カーソルを設定します。
最初のメソッドと問題:
一般的なアプローチでは、再帰的な Common Table Expression (CTE) を使用して日付系列を生成します。
<code class="language-sql">;with GetDates As ( select DATEADD(day,1,@maxDate) as TheDate UNION ALL select DATEADD(day,1, TheDate) from GetDates where TheDate < @minDate )</code>
ただし、この CTE からカーソルを直接設定すると、コンパイル エラーが発生することがよくあります。
解決策:
アプローチ 1: カレンダー テーブルの利用
カレンダー テーブルを事前に作成すると、高度に最適化されたソリューションが提供されます。 このテーブルには事前定義された日付の範囲が保存され、クエリのパフォーマンスが大幅に向上します。
<code class="language-sql">CREATE TABLE Calendar ( Date DATE PRIMARY KEY ); -- Insert dates into the Calendar table (example, adjust as needed) INSERT INTO Calendar (Date) SELECT DATEADD(DAY, n, '20000101') FROM (SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 n FROM master..spt_values) AS Numbers;</code>
日付の取得は単純なクエリになります:
<code class="language-sql">SELECT Date FROM Calendar WHERE Date >= @MinDate AND Date <= @MaxDate;</code>
アプローチ 2: 洗練された再帰的 CTE
カレンダー テーブルが実現できない場合は、洗練された再帰 CTE を使用できます。
<code class="language-sql">DECLARE @MinDate DATE = '20140101'; DECLARE @MaxDate DATE = '20241231'; --Example, replace with your actual date ;WITH DateSeries AS ( SELECT @MinDate AS Date UNION ALL SELECT DATEADD(day, 1, Date) FROM DateSeries WHERE Date < @MaxDate ) SELECT Date FROM DateSeries;</code>
カーソルの推奨事項:
カーソルは一般にセットベースの操作よりも効率が低いことに注意することが重要です。 最適なパフォーマンスを得るには、可能な限りカーソルを避けてください。 上記の CTE アプローチ、特にカレンダー テーブルを使用すると、日付範囲の取得においてはるかに優れたパフォーマンスが得られます。 必要に応じて、予測可能な結果を得るために CTE 内で ORDER BY
を使用することを検討してください。
以上がSQL Server で日付の範囲を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。