2. 期間内の日付一覧の作成
前問では数値型の連番を作成したので、今度は日付型の連番として、2010年5月10日から2010年5月15日までの連番を作成してみます。
select to_char(soeji,'yyyy-mm-dd') as dayVal
from dual
model
dimension by(date '2010-05-10' as soeji)
measures(0 as dummy)
rules(
dummy[for soeji from date '2010-05-10' to date '2010-05-15'
INCREMENT 1]=0);
| dayVal |
| 2010-05-10 |
| 2010-05-11 |
| 2010-05-12 |
| 2010-05-13 |
| 2010-05-14 |
| 2010-05-15 |
処理のイメージを解説すると、まず、model句のdimension by(date '2010-05-10' as soeji)とmeasures(0 as dummy)によって、date型のsoejiを添字として、0を要素名dummyとして持つ配列を用意してます。
プログラム言語の配列には、添字に数値型しか指定できないものがありますが、model句のdimension by句では、数値型や日付型や文字型を使用できます。
次に、model句のrules句でのdummy[for soeji from '2010-05-10' to '2010-05-15' INCREMENT 1]=0によって、soejiを添字とした配列の、添字の2010-05-10,2010-05-11,2010-05-12,2010-05-13,2010-05-14,2010-05-15のdummyに0をupsert(あればupdate,なければinsert)してます。
SQLのイメージは、下のようになります。dimension by(date '2010-05-10' as soeji)に対応する配列の添字を紫色で表現してます。

増分値の指定でInterVal型を使用
下記のように、増分値の指定でInterVal型を使用することもできます。もちろん、InterVal '5' minuteやInterVal '1' hourなどといった使い方もできます。
select to_char(soeji,'yyyy-mm-dd') as dayVal
from dual
model
dimension by(date '2010-05-10' as soeji)
measures(0 as dummy)
rules(
dummy[for soeji from date '2010-05-10' to date '2010-05-15'
INCREMENT InterVal '1' day]=0);
