En un data warehouse hay una serie de dimensiones comunes como son la geografica y la de tiempo. Para quién le pueda servir de ayuda dejo aquí el script de creación de la dimensión tiempo y un procedimiento para hacer la carga entre fechas de la tabla:
/*Base de datos destino*/ use PAnalisys /*Creación de la tabla*/ create table DIM_TIEMPO ( FechaSK int not null, Fecha date not null, Año smallint not null, Trimestre smallint not null, Mes smallint not null, Semana smallint not null, Dia smallint not null, DiaSemana smallint not null, NTrimestre char(7) not null, NMes char(15) not null, NMes3L char(3) not null, NSemana char(10) not null, NDia char(6) not null, NDiaSemana char(10) not null constraint PK_DIM_TIEMPO PRIMARY KEY CLUSTERED ( Fecha asc ) ) /*Script de carga*/ DECLARE @FechaDesde as smalldatetime, @FechaHasta as smalldatetime DECLARE @FechaAAAAMMDD int DECLARE @Año as smallint, @Trimestre char(2), @Mes smallint DECLARE @Semana smallint, @Dia smallint, @DiaSemana smallint DECLARE @NTrimestre char(7), @NMes char(15) DECLARE @NMes3l char(3) DECLARE @NSemana char(10), @NDia char(6), @NDiaSemana char(10) --Set inicial por si no coincide con los del servidor SET DATEFORMAT dmy SET DATEFIRST 1 BEGIN TRANSACTION --Borrar datos actuales, si fuese necesario --TRUNCATE TABLE FROM DI_TIEMPO --RAngo de fechas a generar: del 01/01/2006 al 31/12/Año actual+2 SELECT @FechaDesde = CAST('20060101' AS smalldatetime) SELECT @FechaHasta = CAST(CAST(YEAR(GETDATE())+2 AS CHAR(4)) + '1231' AS smalldatetime) WHILE (@FechaDesde <= @FechaHasta) BEGIN SELECT @FechaAAAAMMDD = YEAR(@FechaDesde)*10000+ MONTH(@FechaDesde)*100+ DATEPART(dd, @FechaDesde) SELECT @Año = DATEPART(yy, @FechaDesde) SELECT @Trimestre = DATEPART(qq, @FechaDesde) SELECT @Mes = DATEPART(m, @FechaDesde) SELECT @Semana = DATEPART(wk, @FechaDesde) SELECT @Dia = RIGHT('0' + DATEPART(dd, @FechaDesde),2) SELECT @DiaSemana = DATEPART(DW, @FechaDesde) SELECT @NMes = DATENAME(mm, @FechaDesde) SELECT @NMes3l = LEFT(@NMes, 3) SELECT @NTrimestre = 'T' + CAST(@Trimestre as CHAR(1)) + '/' + RIGHT(@Año, 2) SELECT @NSemana = 'Sem ' +CAST(@Semana AS CHAR(2)) + '/' + RIGHT(RTRIM(CAST(@Año as CHAR(4))),2) SELECT @NDia = CAST(@Dia as CHAR(2)) + ' ' + RTRIM(@NMes) SELECT @NDiaSemana = DATENAME(dw, @FechaDesde) INSERT INTO PAnalisys.dbo.DIM_TIEMPO ( FechaSK, Fecha, Año, Trimestre, Mes, Semana, Dia, DiaSemana, NTrimestre, NMes, NMes3L, NSemana, NDia, NDiaSemana ) VALUES ( @FechaAAAAMMDD, @FechaDesde, @Año, @Trimestre, @Mes, @Semana, @Dia, @DiaSemana, @NTrimestre, @NMes, @NMes3l, @NSemana, @NDia, @NDiaSemana ) --Incremento del bucle SELECT @FechaDesde = DATEADD(DAY, 1, @FechaDesde) END COMMIT TRANSACTION
A partir de aquí cada uno puede modificarla a su gusto añadiendo o quitando atributos
MySQL
Subido por bernabeu_dario el 29 Julio, 2009 - 17:31
Excelente aporte!
Hacia rato que tenía ganas de mostrar un ejemplo de la estructura de la dimensión tiempo y cómo realizar la carga de la misma, así que aproveché tu post para crear una entrada en mi blog, en donde básicamente traduje lo que tú has hecho en MySQL.
Gracias por compartir. Saludos!
Lo mismo digo
Subido por il_masacratore el 30 Julio, 2009 - 09:14
En respuesta a MySQL por bernabeu_dario
Lo mismo digo bernabeu_dario!!
Script
Subido por Juan Pablo Lastra (no verificado) el 16 Marzo, 2010 - 03:37
Muy buen ejemplo...
Muchas gracias por tu
Subido por AnaMaria (no verificado) el 29 Octubre, 2013 - 21:15
Hola, estoy intentando hacer
Subido por AnaMaria (no verificado) el 30 Octubre, 2013 - 13:06
Una pregunta corta, he ido a
Subido por AnaMaria (no verificado) el 30 Octubre, 2013 - 13:08
Cuál es la sentencia que te
Subido por Carlos el 30 Octubre, 2013 - 23:12
En respuesta a Una pregunta corta, he ido a por AnaMaria (no verificado)
ya me funcionó! El ejemplo de
Subido por AnaMaria (no verificado) el 7 Noviembre, 2013 - 02:22
Bueno el ejemplo. Pero veo
Subido por Javier (no verificado) el 23 Enero, 2015 - 20:54
Bueno el ejemplo. Pero veo que el primer dia de la semana es Monday.¿Que tengo que hacer para que el primer dia de la semana sea Sunday?
Saludos,
Javier Vega.
Buenas Javier, cómo estás?
Subido por bernabeu_dario el 16 Febrero, 2015 - 16:31
En respuesta a Bueno el ejemplo. Pero veo por Javier (no verificado)
Buenas Javier, cómo estás?
En MySQL puedes hacer algo como:
dayofweek('2015-02-16')-1
Sino podrías emplear un CASE.
Saludos