Buenas.
Este post esta basado en el de il-masacratore, más precisamente en su última entrada: Estructura de la dimensión tiempo y script de carga para SQLServer. Tal y como dice il-masacratore casi siempre existen una serie de dimensiones que son comunes para todo DW, la dimensión Tiempo es una de ellas.
El objetivo de este post es traducir lo hecho por il-masacratore (SQLServer) para que pueda ser ejecutado en MySQL.
Cabe destacar que esta estructura y su consiguiente procedure, tienen fines explicativos y ejemplificadores, para que cada unx pueda luego crear su propia Dimensión Tiempo de acuerdo a sus necesidades y preferencias.
CREACION DE ESTRUCTURA DE LA DIMENSION TIEMPO
CREATE TABLE `dwventas`.`DIM_TIEMPO` (
`FechaSK` int(11) NOT NULL,
`Fecha` date NOT NULL,
`Anio` smallint(6) NOT NULL,
`Trimestre` smallint(6) NOT NULL,
`Mes` smallint(6) NOT NULL,
`Semana` smallint(6) NOT NULL,
`Dia` smallint(6) NOT NULL,
`DiaSemana` smallint(6) NOT NULL,
`NTrimestre` varchar(7) NOT NULL,
`NMes` varchar(15) NOT NULL,
`NMes3L` varchar(3) NOT NULL,
`NSemana` varchar(11) NOT NULL,
`NDia` varchar(15) NOT NULL,
`NDiaSemana` varchar(15) NOT NULL,
PRIMARY KEY (`FechaSK`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREACION DEL PROCEDURE DE CARGA
DELIMITER $$
DROP PROCEDURE IF EXISTS `dwventas`.`antDIM_TIEMPO`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `antDIM_TIEMPO`()
BEGIN
delete from DIM_TIEMPO;
SELECT '2006-01-01' INTO @fi;
SELECT '2009-07-29' INTO @ff;
while (@fi <= @ff) DO
INSERT INTO DIM_TIEMPO
(
FechaSK,
Fecha,
Anio,
Trimestre,
Mes,
Semana,
Dia,
DiaSemana,
NTrimestre,
NMes,
NMes3L,
NSemana,
NDia,
NDiaSemana
)
SELECT year(@fi)*10000+month(@fi)*100+day(@fi) as FechaSK,
(@fi) Fecha,
year(@fi) Anio,
quarter(@fi) Trimestre,
month(@fi) Mes,
week(@fi) Semana,
RIGHT(concat('0',day(@fi)),2) Dia,
weekday(@fi) DiaSemana,
concat('T',quarter(@fi),'/',year(@fi))NTrimestre,
monthname(@fi) NMes,
LEFT(monthname(@fi),3) NMes3L,
concat('Sem ',week(@fi) ,'/', year(@fi)) NSemana,
concat(RIGHT(concat('0',day(@fi)),2),' ',monthname(@fi)) NDia,
dayname(@fi) NDiaSemana;
set @fi = DATE_ADD(@fi, INTERVAL 1 DAY);
END WHILE;
END$$
DELIMITER ;
il-masacratore gracias por compartir!
Espero les sea útil.
Saludos.
Excelente!!! Muchas gracias
Submitted by maxipefeu (not verified) on 22 March, 2017 - 16:04
Excelente!!! Muchas gracias por compartir. Lo único que agregué fue la localización con lc_time_names = 'es_AR' para Español Argentina.