Usando CTE’s para construir la dimensión de tiempo 3/3
Posted by Miguel Egea | Posted in Analisys Services, Relacional | Posted on 27-12-2009
1
Empezaremos este tercer artículo de la serie simplemente creando una tabla que alojará nuestros datos de tiempo en distintos idiomas, una vez rellenada esta tabla, puede servirnos perfectamente de base para la creación de una dimensión tiempo, que será el siguiente artículo, en el que comenzaremos a crear el proyecto de Analisys Services para construir la dimensión tiempo.
La tabla contiene la estrucutra básica para contener todos los datos necesarios relacionados con el tiempo , y además tiene la versión en castellano, francés e ingles de estos datos
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 27 28 | CREATE TABLE [Dimensiones].[Tiempo]( [FechaKey] [int] not NULL primary key , [Fecha] [datetime] NULL, [Año] [int] NULL, [Numero_Mes] [int] NULL, [Mes_Castellano] [nvarchar](30) NULL, [Mes_año_Castellano] [nvarchar](35) NULL, [MesKey] [int] NULL, [Semana] [int] NULL, [SemanaKey] [int] NULL, [Fecha_Castellano] [nvarchar](52) NULL [TipoDia] [varchar](13) NOT NULL, [DiaDelAño] [int] NULL, [DiaDeLaSemana] [int] NULL, [DiaDelMes] [int] NULL, [Dia_castellano] [nvarchar](30) NULL,<code>[Mes_Inglés] [nvarchar](30) NULL, [Mes_año_Inglés] [nvarchar](35) NULL, [Fecha_Inglés] [nvarchar](52) NULL, [Dia_Inglés] [nvarchar](30) NULL, [Mes_Francés] [nvarchar](30) NULL, [Mes_año_Francés] [nvarchar](35) NULL, [Fecha_Francés] [nvarchar](52) NULL, [Dia_Francés] [nvarchar](30) NULL ) ON [PRIMARY] GO |
Una vez que tenemos la tabla tenemos que rellenarla para ello usaremos el mismo código que la vista del artículo anterior. En este caso si podemos utilizar las cláusulas que hablamos en el primer artículo SET DATE FIRST y SET LANGUAGE, de forma que todo esté adecuadamente configurado cuando hagamos los inserts y los updates corresponeientes. Veamnos como rellenar la tabla con las fechas que deseamos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | set language spanish; set datefirst 1; insert into dimensiones.tiempo (FechaKey, Fecha, Año, Numero_Mes, Mes_Castellano, Mes_año_Castellano, MesKey, Semana, SemanaKey, Fecha_Castellano, TipoDia, DiaDelAño, DiaDeLaSemana, DiaDelMes, Dia_castellano) select CAST(CONVERT(varchar(10),fecha + id ,112) as int) FechaKey, fecha+id as Fecha, YEAR(fecha+ID) as año, MONTH(fecha+id) as Numero_Mes, DATENAME(month,fecha+id) Mes_Castellano, DATENAME(month,Fecha + id ) +' '+ cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Castellano, year(Fecha + id )*100+month(Fecha + id ) MesKey, DATEPART(DW,Fecha + id ) Semana, year(Fecha + id )*100 + DATEPART(DW,Fecha + id ) SemanaKey, cast(DAY(Fecha + id ) as varchar(10)) + ' de ' + DATENAME(MM,Fecha + id ) + ' de ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Castellano, case when datepart(weekday,Fecha + id )>5 then 'Fin de semana' else 'Semana' end TipoDia, datepart(dayofyear,Fecha + id ) DiaDelAño, DATEPART(DW,Fecha + id ) DiaDeLaSemana, DATEPART(dd,Fecha + id ) DiaDelMes, DATENAME(dw,Fecha + id ) Dia_castellano</code> from (select CAST('19991231' as datetime) fecha ) tabla cross join nums; |
Con este primer insert tendremos rellena la mayor parte de la tabla y los descriptores en castellano, sin embargo, aún no tenemos rellenados los campos en inglés y francés que pretendemos tener completos. Veamos el código para actualizar la parte en inglés
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | set language english; update Dimensiones.Tiempo set Fecha_Inglés=a.Fecha_Inglés, Dia_Inglés=a.Dia_ingles, Mes_año_Inglés=a.Mes_año_Inglés, Mes_Inglés=a.Mes_Inglés from ( select CAST(CONVERT(varchar(10),fecha + id ,112) as int) FechaKey, DATENAME(month,fecha+id) Mes_Inglés, DATENAME(month,Fecha + id ) +' '+ cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Inglés, DATENAME(MM,Fecha + id ) ++ ' ' +cast(DAY(Fecha + id ) as varchar(10)) + ', ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Inglés, DATENAME(dw,Fecha + id ) Dia_ingles from (select CAST('19991231' as datetime) fecha ) tabla cross join nums ) a inner join Dimensiones.Tiempo on a.FechaKey=Dimensiones.Tiempo.FechaKey |
En francés tendremos que hacer algo parecido, simplemente hay que elegir de nuevo el idioma.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | set language français; update Dimensiones.Tiempo set Fecha_Francés=a.Fecha_Francés, Dia_Francés=a.Dia_ingles, Mes_año_Francés=a.Mes_año_Francés, Mes_Francés=a.Mes_Francés from ( select CAST(CONVERT(varchar(10),fecha + id ,112) as int) FechaKey, DATENAME(month,fecha+id) Mes_Francés, DATENAME(month,Fecha + id ) +' '+ cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Francés, DATENAME(MM,Fecha + id ) ++ ' ' +cast(DAY(Fecha + id ) as varchar(10)) + ', ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Francés, DATENAME(dw,Fecha + id ) Dia_ingles from (select CAST('19991231' as datetime) fecha ) tabla cross join nums ) a inner join Dimensiones.Tiempo on a.FechaKey=Dimensiones.Tiempo.FechaKey |
Espero que os sirva el código.
