Como Construir la dimension tiempo en Oracle

Como ya lo hice con SQL Server, también tengo que hacerlo con Oracle. La construcción de una dimensión de tiempo en Oracle, lo bueno de esta Forma es que es mucho más completa que la expuesta para SQL.

En esta oportunidad no la voy a hacer en copo de nieve como ya lo había hecho, sino que lo hago en modo estrella para que puedan ver la diferencia de tener una dimensión de una forma u otra (Como queda la jerarquía en una y otra).

Espero que les guste :)

Modelo:


DROP TABLE BIFENALCO.DIM_TIEMPO1;
CREATE TABLE BIFENALCO.DIM_TIEMPO1 (
FUENTE VARCHAR2(50),
TIEMPO_SK NUMBER,
TIEMPO_NK VARCHAR2(100),
FECHA_DT DATE,
PERIODO_CD NUMBER(10),
ANIO_CD NUMBER(10),
NUMERO_SEMESTRE_CD VARCHAR2(5),
NOMBRE_SEMESTRE_DS VARCHAR2(50),
NUMERO_TRIMESTRE_CD VARCHAR2(5),
NOMBRE_TRIMESTRE_DS VARCHAR2(50),
NUMERO_MES_CD NUMBER(5),
NOMBRE_MES_DS VARCHAR2(50),
SEMANA_CD NUMBER(5),
NUMERO_DIA_CD NUMBER(5),
NOMBRE_DIA_DS VARCHAR2(50),
DIA_HABIL_FG VARCHAR2(1),
DIA_FESTIVO_FG VARCHAR2(1),
DIAS_HABILES_MES NUMBER(5),
DIAS_CALENDARIO_MES NUMBER(5),
CREACION_REGISTRO_DT DATE,
ACTUALIZACION_REGISTRO_DT DATE,
FUENTE_MAPEO VARCHAR2(100),
ATRIBUTO1 VARCHAR2(50),
ATRIBUTO2 VARCHAR2(50),
ATRIBUTO3 VARCHAR2(50)
)TABLESPACE TBS_DIM_DATOS;


Procedimiento para llenar el modelo:


PROCEDURE p_insertar_dimtiempo AS
  
  Fecha_Ini DATE;
  Aux DATE;
  Fuente VARCHAR2(50);
  Anio_Aux INTEGER;
  
  BEGIN
    
    Fecha_Ini := to_date('20060101','YYYYMMDD');
    Fuente := 'Automatico';
  
    Select Max(Fecha_DT) Into Aux From bifenalco.Dim_Tiempo1;
    
    IF Aux IS NOT NULL THEN
      Fecha_Ini := Aux + 1;
    END IF;
    
    anio_aux := to_number(to_char(fecha_ini,'YYYY'));
    
    WHILE to_number(to_char(fecha_ini,'YYYY')) = anio_aux LOOP  
      
      Insert Into bifenalco.Dim_Tiempo1 (FUENTE,TIEMPO_SK,TIEMPO_NK,FECHA_DT,PERIODO_CD,ANIO_CD,NUMERO_SEMESTRE_CD,NOMBRE_SEMESTRE_DS,NUMERO_TRIMESTRE_CD,NOMBRE_TRIMESTRE_DS,NUMERO_MES_CD,NOMBRE_MES_DS,SEMANA_CD,NUMERO_DIA_CD,NOMBRE_DIA_DS,DIA_HABIL_FG,DIA_FESTIVO_FG,CREACION_REGISTRO_DT,ACTUALIZACION_REGISTRO_DT)
      Select 'AUTOMATICO' FUENTE,
        to_number(to_char(Fecha_Ini,'YYYYMMDD')) TIEMPO_SK,
        Fecha_Ini TIEMPO_NK,
        Fecha_Ini FECHA_DT,
        to_char(Fecha_Ini, 'YYYYMM') PERIODO_CD,
        to_char(Fecha_Ini, 'YYYY') ANIO_CD,
        case when to_char(Fecha_Ini, 'MM') <= 6 THEN 'I' ELSE 'II' END NUMERO_SEMESTRE_CD,
        case when to_char(Fecha_Ini, 'MM') <= 6 THEN 'SEMESTRE I - '||to_char(Fecha_Ini, 'YYYY') ELSE 'SEMESTRE II - '||to_char(Fecha_Ini, 'YYYY') END NOMBRE_SEMESTRE_DS,
        case  when to_char(Fecha_Ini, 'MM') <= 3 THEN 'I' 
              when to_char(Fecha_Ini, 'MM') > 3 and to_char(Fecha_Ini, 'MM') <= 6 THEN 'II'
              when to_char(Fecha_Ini, 'MM') > 6 and to_char(Fecha_Ini, 'MM') <= 9 THEN 'III'
              ELSE 'IV' 
        END NUMERO_TRIMESTRE_CD,
        case  when to_char(Fecha_Ini, 'MM') <= 3 THEN 'TRIMESTRE I - '|| to_char(Fecha_Ini, 'YYYY')
              when to_char(Fecha_Ini, 'MM') > 3 and to_char(Fecha_Ini, 'MM') <= 6 THEN 'TRIMESTRE II - '|| to_char(Fecha_Ini, 'YYYY')
              when to_char(Fecha_Ini, 'MM') > 6 and to_char(Fecha_Ini, 'MM') <= 9 THEN 'TRIMESTRE III - '|| to_char(Fecha_Ini, 'YYYY')
              ELSE 'TRIMESTRE IV - '|| to_char(Fecha_Ini, 'YYYY')
        END NOMBRE_TRIMESTRE_DS,
        to_number(to_char(Fecha_Ini, 'MM')) NUMERO_MES_CD,
        trim(to_char(Fecha_Ini, 'MONTH')) NOMBRE_MES_DS,
        to_char(Fecha_Ini, 'ww') SEMANA_CD,
        case when to_char(to_char(Fecha_Ini,'d') -1) = '0' then '7' else to_char(to_char(Fecha_Ini,'d') -1) end NUMERO_DIA_CD,
        to_char(Fecha_Ini,'FMDAY') NOMBRE_DIA_DS,
        case when to_char(to_char(Fecha_Ini,'d') -1) > 0 AND to_char(to_char(Fecha_Ini,'d') -1) <= 5  then '1' else '0' end DIA_HABIL_FG,
        case when to_char(to_char(Fecha_Ini,'d') -1) = 0 then '1' else '0' end DIA_FESTIVO_FG,
        sysdate CREACION_REGISTRO_DT,
        sysdate ACTUALIZACION_REGISTRO_DT
      From Dual;
      commit;
      
      Fecha_Ini := fecha_ini + 1;
      
    END LOOP;
    
  END p_insertar_dimtiempo;

Comentarios

Entradas populares de este blog

Como Construir la dimension tiempo en SQL SERVER

Reiniciar el Intelligence Server de Microstrategy

Modelo en Copo de Nieve