SQL Server で 2 つの日付間のすべての日付を取得するためのトリック
SQL Server では、指定された日付範囲内のすべての日付を取得すると、データ分析、日付処理、レコード保存などのタスクに役立ちます。この記事では、指定された 2 つの日付間の連続する日付のシーケンスを効率的に取得するいくつかの方法を紹介します。
再帰共通テーブル式 (CTE) を使用する
1 つの方法は、再帰的 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 ) select TheDate from GetDates</code>
ただし、この CTE は日付の選択には機能しますが、結果をカーソルに保存しようとするとコンパイル エラーが発生するため、困難になります。
代替方法
効率を高めて運用を簡素化するには、次の代替案を検討してください。
1. 日付テーブルを使用します
事前に日付テーブルを作成すると、クエリは非常に単純になります。
<code class="language-sql">DECLARE @MinDate DATE = '20140101', @MaxDate DATE = '20140106'; SELECT Date FROM dbo.Calendar WHERE Date >= @MinDate AND Date <= @MaxDate;</code>
2. 日付テーブルを使用せずに日付シーケンスを生成します
日付テーブルがない場合は、次の手法を使用して日付シーケンスを動的に生成できます:
<code class="language-sql">DECLARE @MinDate DATE = '20140101', @MaxDate DATE = '20140106'; SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) FROM sys.all_objects a CROSS JOIN sys.all_objects b;</code>
3. 日付の反復にカーソルを使用しないでください
一般に、日付の反復にカーソルを使用しないことをお勧めします。一般に、コレクションベースのアプローチはより効率的でスケーラブルです。たとえば、特定の日付の数量を取得したい場合は、次のクエリを使用できます:
<code class="language-sql">SELECT TOP 1 date, it_cd, qty FROM T WHERE it_cd = 'i-1' AND Date = '20140101';</code>
カーソルの使用を回避し、これらの代替手法を活用することで、SQL Server で指定された範囲内のすべての日付を効率的に取得できます。
以上がSQL Server で 2 つの日付の間のすべての日付を効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。