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
Submitted by bernabeu_dario on 29 July, 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
Submitted by il_masacratore on 30 July, 2009 - 09:14
In reply to MySQL by bernabeu_dario
Lo mismo digo bernabeu_dario!!
Script
Submitted by Juan Pablo Lastra (not verified) on 16 March, 2010 - 03:37
Muy buen ejemplo...
Muchas gracias por tu
Submitted by AnaMaria (not verified) on 29 October, 2013 - 21:15
Hola, estoy intentando hacer
Submitted by AnaMaria (not verified) on 30 October, 2013 - 13:06
Una pregunta corta, he ido a
Submitted by AnaMaria (not verified) on 30 October, 2013 - 13:08
Cuál es la sentencia que te
Submitted by Carlos on 30 October, 2013 - 23:12
In reply to Una pregunta corta, he ido a by AnaMaria (not verified)
ya me funcionó! El ejemplo de
Submitted by AnaMaria (not verified) on 7 November, 2013 - 02:22
Bueno el ejemplo. Pero veo
Submitted by Javier (not verified) on 23 January, 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?
Submitted by bernabeu_dario on 16 February, 2015 - 16:31
In reply to Bueno el ejemplo. Pero veo by Javier (not verified)
Buenas Javier, cómo estás?
En MySQL puedes hacer algo como:
dayofweek('2015-02-16')-1
Sino podrías emplear un CASE.
Saludos