Création et alimentation d’une dimension DATE

Lors de la création d’un entrepôt de données, bien souvent, il contient une dimension DATE contenant la liste des dates depuis l’année 1900 jusqu’à l’année 2999. Cette table contenant plusieurs attributs comme par exemple :

  • La date au format date
  • La date au format chaine de caractère sous la forme DD/MM/YYYY
  • La date au format numérique sous la forme YYYYMMDD
  • Le jour de l’année

Voici donc un exemple de création de DIM_DATE en Oracle.

Tout d’abord la description de la DIM_DATE :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create table DIM_DATE
(
   ID_DATE        NUMBER(8)            not null,
   DATE_DU_JOUR         DATE                 not null,
   ANNEE_CALENDAIRE     NUMBER(4),
   SEMESTRE             NUMBER(1),
   LIBELLE_SEMESTRE     VARCHAR2(250 CHAR),
   TRIMESTRE            NUMBER(1),
   LIBELLE_TRIMESTRE    VARCHAR2(250 CHAR),
   ANNEE_MOIS           NUMBER(6),
   MOIS                 NUMBER(2),
   LIBELLE_MOIS         VARCHAR2(250 CHAR),
   SEMAINE              NUMBER(2),
   JOUR                 NUMBER(2),
   LIBELLE_JOUR         VARCHAR2(250 CHAR),
   JOUR_FERIE           CHAR(3 CHAR),
   JOUR_OUVRE           CHAR(3 CHAR),
   QUANTIEME_JOUR       NUMBER
);

Et son chargement avec un simple ordre INSERT et une requête SELECT hiérarchique :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
INSERT INTO DIM_DATE (ID_DATE, DATE_DU_JOUR, ANNEE_CALENDAIRE, SEMESTRE, LIBELLE_SEMESTRE, TRIMESTRE, LIBELLE_TRIMESTRE, ANNEE_MOIS,MOIS, LIBELLE_MOIS, SEMAINE, JOUR, LIBELLE_JOUR, JOUR_FERIE, JOUR_OUVRE, QUANTIEME_JOUR)
SELECT
    TO_NUMBER(TO_CHAR(DT_CAL, 'YYYYMMDD')) AS ID_CALENDRIER,
    DT_CAL AS DATE_DU_JOUR,
    TO_NUMBER(TO_CHAR(DT_CAL, 'YYYY')) AS ANNEE_CALENDAIRE,
    ROUND(TO_NUMBER(TO_CHAR(DT_CAL, 'Q'))/2) AS SEMESTRE,
    CASE ROUND(TO_NUMBER(TO_CHAR(DT_CAL, 'Q'))/2) WHEN 1 THEN '1er semestre' ELSE '2ème semestre' END AS LIBELLE_SEMESTRE,
    TO_NUMBER(TO_CHAR(DT_CAL, 'Q')) AS TRIMESTRE,
    CASE TO_NUMBER(TO_CHAR(DT_CAL, 'Q')) WHEN 1 THEN '1er trimestre' ELSE TO_NUMBER(TO_CHAR(DT_CAL, 'Q')) || 'ème trimestre' END AS LIBELLE_TRIMESTRE,
    TO_NUMBER(TO_NUMBER(TO_CHAR(DT_CAL, 'YYYY')) || LPAD(TO_CHAR(DT_CAL, 'MM'), 2, '0')) AS ANNEE_MOIS,
    TO_NUMBER(TO_CHAR(DT_CAL, 'MM')) AS MOIS,
    TO_CHAR(DT_CAL, 'Month') AS LIBELLE_MOIS,
    TO_NUMBER(TO_CHAR(DT_CAL, 'IW')) AS SEMAINE,
    TO_NUMBER(TO_CHAR(DT_CAL, 'DD')) AS JOUR,
    TO_CHAR(DT_CAL, 'Day') AS LIBELLE_JOUR,
    CASE WHEN TO_CHAR(DT_CAL, 'D') IN ('6', '7') THEN 'Oui' ELSE 'Non' END AS JOUR_FERIE,
    CASE WHEN TO_CHAR(DT_CAL, 'D') IN ('6', '7') THEN 'Non' ELSE 'Oui' END AS JOUR_OUVRE,
    NUM_JOUR AS QUANTIEME_JOUR
FROM
(
    SELECT to_date('19000101','YYYYMMDD') + (rownum - 1) AS DT_CAL, rownum AS NUM_JOUR
    FROM dual
    connect BY to_date('19000101','YYYYMMDD') + (rownum - 1) <= to_date('29991231','YYYYMMDD')
);
 
COMMIT;

Laisser un commentaire