日期维表数据生成方法(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;

最后,调用存储过程,输入开始日期和结束日期,就可以生成这一时间段内的数据。

posted @ 2011-10-01 01:03  BrightSea  阅读(5517)  评论(0编辑  收藏  举报