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

SQL Server で日付範囲を効率的に取得するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-12 11:22:42446ブラウズ

How to Efficiently Retrieve a Date Range in SQL Server?

SQL Server で 2 つの特定の日付間のすべての日付を取得します

要件

目標は、開始日から終了日までの指定された範囲内のすべての日付の完全なリストを取得することです。この情報は、後続の処理のためにカーソルに保存されます。

チャレンジ

このタスクを達成するために、再帰共通テーブル式 (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 サイトの他の関連記事を参照してください。

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