mysql日期维表sql文件_日期维表数据生成方法(Oracle方式)

本文介绍了两种在Oracle 10g中自动创建和填充日期维表的技巧。第一种方法利用rownum伪列,通过SQL创建日期维表,但数据量受限于all_objects表的记录数。第二种方法是编写存储过程,可生成指定日期范围内的日期维表数据,更加灵活。这两种方法都能避免手动操作,提高效率。
摘要由CSDN通过智能技术生成

对历史数据的保存是数据仓库的主要特征之一,在构建事实表时,通常都会有日期关键字来与日期维表进行关联,以实现对事实表基于日期特征的分析。如果数据仓库涉及的日期不是很长,简单可以通过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;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值