日付範囲から日ごとのデータを作成する
日付範囲から日ごとのデータを作成するには?
「 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);
@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 型にキャストしないとエラーになります。