日期维表数据生成方法(Oracle方式)
对历史数据的保存是数据仓库的主要特征之一,在构建事实表时,通常都会有日期关键字来与日期维表进行关联,以实现对事实表基于日期特征的分析。如果数据仓库涉及的日期不是很长,简单可以通过excel工具手动来生成日期维表并导入到数据库中,但一般的数据仓库都会涉及很长时期的存储,所以手动方式的适用度并不强,当另外计算用VBA编程实现了日期维表数据的生成,也需要通过导入技术导入到数据库中,显得不是很方便。下面介绍两种利用数据库的一些小窍门,实现自动填充日期维表的方法,这两个方式在oracle 10g测试通过,可以直接拷贝代码使用。
1、利用rownum,通过sql创建日期维表并直接生成数据
rownum是数据表的伪列,是在查询结果集生成后加上的一列。
CREATE OR REPLACE table DIM_DATE_T AS SELECT TRUNC(TO_DATE('2000-01-01', 'yyyy-mm-dd')) + ROWNUM - 1 AS f_date, to_char(TRUNC(TO_DATE('2000-01-01', 'yyyy-mm-dd')) + ROWNUM - 1,'yyyy') as f_year, to_char(TRUNC(TO_DATE('2000-01-01', 'yyyy-mm-dd')) + ROWNUM - 1,'mm') as f_month, to_char(TRUNC(TO_DATE('2000-01-01', 'yyyy-mm-dd')) + ROWNUM - 1,'dd') as f_day, to_char(TRUNC(TO_DATE('2000-01-01', 'yyyy-mm-dd')) + ROWNUM - 1,'day') as f_week FROM all_objects WHERE TRUNC(TO_DATE('2000-01-01', 'yyyy-mm-dd')) + ROWNUM - 1 != TRUNC(TO_DATE('2011-01-01', 'yyyy-mm-dd'));
这种方法有个缺点就是,生成的数据条数不会超过all_objects里的记录数。
2、通过编写存储过程填充日期维表
这种方法可以生成时间段任意长的日期维表数据。
首先创建日期维表:
create table DIM_DATE_T ( F_DATE DATE, F_YEAR VARCHAR2(10), F_MONTH VARCHAR2(10), F_DAY VARCHAR2(10), F_WEEK VARCHAR2(20) )
其次创建用于生成数据的存储过程:
create or replace procedure fill_dim_date_t_p(start_date in char, end_date in char) as v_counter number := 0; v_max number := 0; begin execute immediate 'truncate table dim_date_t'; v_max := to_number(TO_DATE(end_date, 'yyyy-mm-dd')-TO_DATE(start_date, 'yyyy-mm-dd')); loop insert into dim_date_t (F_DATES,F_YEAR,F_MONTH,F_DAY,F_WEEK) values ( TO_DATE(start_date, 'yyyy-mm-dd')+v_counter, to_char(TO_DATE(start_date, 'yyyy-mm-dd') + v_counter,'yyyy'), to_char(TO_DATE(start_date, 'yyyy-mm-dd') + v_counter,'mm'), to_char(TO_DATE(start_date, 'yyyy-mm-dd') + v_counter,'dd'), to_char(TO_DATE(start_date, 'yyyy-mm-dd') + v_counter,'day') ); exit when v_counter >= v_max; v_counter := v_counter+1; end loop; commit; end fill_dim_date_t_p;
最后,调用存储过程,输入开始日期和结束日期,就可以生成这一时间段内的数据。