ホームページ >データベース >mysql チュートリアル >SQL Server で日付範囲を効率的に取得するにはどうすればよいですか?
目標は、開始日から終了日までの指定された範囲内のすべての日付の完全なリストを取得することです。この情報は、後続の処理のためにカーソルに保存されます。
このタスクを達成するために、再帰共通テーブル式 (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 結果を入力しようとしたときにエラーが発生しました:
<code class="language-sql">SET @DateCurSor = CURSOR FOR SELECT TheDate FROM GetDates</code>
エラー メッセージには、キーワード「SET」付近の構文エラーが示されています。
もう 1 つの方法として、カレンダーを使用することをお勧めします。カレンダー テーブルが存在しない場合は、簡単に作成できます。このテーブルは日付を表形式で表現するもので、検索プロセスが大幅に簡素化されます。
<code class="language-sql">DECLARE @MinDate DATE = '20140101', @MaxDate DATE = '20140106'; SELECT Date FROM dbo.Calendar WHERE Date >= @MinDate AND Date <= @MaxDate;</code>
カレンダー テーブルがない場合は、システム テーブル sys.all_objects を含む簡単な手順が提供されます。
<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>
SQL Server でカーソルを使用することは、一般的に推奨されません。対照的に、セットベースの操作はパフォーマンスが優れているため、より一般的です。説明したシナリオでは、特定の日付の特定の品目の数量を決定するタスクは、カーソルを使用せずに実行できます。
<code class="language-sql">SELECT TOP 1 date, it_cd, qty FROM T WHERE it_cd = 'i-1' AND Date BETWEEN @MinDate AND @MaxDate;</code>
以上がSQL Server で日付範囲を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。