日付を推測するコード( VikramJainのSQL Server 用の再帰 CTEなど) を作成することはできますが、 CPU の負荷が高くなります。膨大な数のレコードがあり、長期間にわたる場合、大量のデータを繰り返し構築していることになります。そして、データをクエリするたびにそれを行っています。最も CPU 効率の良い方法は、単純に別のテーブルを用意することです。
データベースを Dimension テーブルと Fact テーブルの観点から考えると、開始日と終了日は暗黙の Dimension のキーにすぎませんTime
。暗黙的ではなく明示的にCalendar
テーブルを作成します。それでは些細なことで・・・
SELECT
yourTable.code,
calendar.calendar_date
FROM
yourTable
INNER JOIN
calendar
ON calendar.calendar_date >= yourTable.fromDate
AND calendar.calendar_date < yourTable.toDate
これにより、CPU 負荷が大幅に削減される可能性があり、クエリが大幅に簡素化されます。
必要なすべてをカバーする日付が事前に入力されたテーブルを作成すると、多くの厄介な日付操作が単純なインデックス可能なルックアップになります。
そのテーブルに次のようなメタデータを追加することもできます...
- start_of_week
- start_of_month
- 会計年度
- などなど
これを非エレガントだと批判する人もいます。個人的には反対のように感じます:
- 乱雑な日付ベースの計算をキャッシュします
- 明示的にディメンション テーブルを作成します
TeraData でも非常に効果的に使用されていますsys_calendar.calendar
。