zoukankan      html  css  js  c++  java
  • 日期维表数据生成方法(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;
    

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

  • 相关阅读:
    php面向对象三大特性
    php面向对象的重写与重载
    一组成对的数字,找出不成对的数字
    如何创建dll以及使用
    常见运行时错误
    连续数的和
    绕圆圈取球
    第一章 概述
    错误2038
    一个简单的环境光shader
  • 原文地址:https://www.cnblogs.com/dlts26/p/2196307.html
Copyright © 2011-2022 走看看