SQL Server 入門 SQL Server 入門

日付範囲から日ごとのデータを作成する

ホーム > 便利なT-SQL&クエリー集 > 日付範囲から日ごとのデータを作成する

日付範囲から日ごとのデータを作成するには?

「 2014 年 1 月 1 日から 2014 年 1 月 31 日まで 」 のような From と To の日付範囲があり、そこからカレンダーのような日毎のデータを作成したいような時ありますよね。

そんな時に便利な、日付範囲から日ごとのデータを作成するクエリーをご紹介したいと思います。

共通テーブル式:CTE (Common Table Expression) を使った日付範囲から日ごとのデータの作成

日付範囲から日ごとのデータを作成には、いろいろな方法があると思います。

ここでは覚えてしまえばシンプルで簡単な 「共通テーブル式: CTE (Common Table Expression)」 を使用する再起クエリーを使った方法をご紹介します。


共通テーブル式 (CTE) を使用する再起クエリー使って、日付範囲から日毎のデータを取得するクエリーは以下の通りです。

DECLARE @DateFrom   AS DATE = '2014-01-01',
        @DateTo     AS DATE = '2014-01-31';

WITH DateTable (MyDate)
AS
(
     SELECT @DateFrom
     UNION ALL
     SELECT DATEADD(dd, 1, MyDate)
     FROM   DateTable
     WHERE  MyDate < @DateTo
)
SELECT   MyDate
FROM     DateTable
OPTION (MAXRECURSION 0);

日付範囲から日ごとのデータを作成するクエリーの実行結果

青で囲まれている部分がアンカーの定義、緑で囲まれている部分が再起の定義です。

クエリーヒントの MAXRECURSION を使って、再起を繰り返す回数を指定することができます。 ここでは 0(無制限)を指定しています。

0 (無制限)を設定すると、間違った再起クエリーを書くと無限ループになってしまう可能性があるので、気をつけてくださいね。

日付範囲から日ごとのデータを作成するクエリーの解説


ちなみに、CTE 内の @DateFrom と @DateTo の箇所に直接日付を指定したい場合は、DATE 型にキャストしないとエラーになります。

SQL Server 関連のおすすめ書籍
ホーム > 便利なT-SQL&クエリー集 > 日付範囲から日ごとのデータを作成する