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; |
Bonjour,
Un exemple pour faire pareil dans une base de données MS SQL Server ?
Merci.