Usando CTE’s para crear tablas de tiempo 1/?

Posted by admin | Posted in Relacional | Posted on 26-12-2009

0

En el artículo anterior usamos la funcionalidad introducida en SQL 2005 de las CTE’s , Vimos como crear un contador sin utilizar while, ni cursores, ahora usaremos la misma técnica para simular una dimensión de tipo tiempo para un datawarehouse, lo que vamos a usar básicamente es la CTE para crear un incremental de fecha y las funciones de fecha para construir todas las variaciones que vamos a necesitar. Las variaciones son bastante auto-descriptivas, simplemente recordar que las funciones datepart y date-name nos ayudan mucho.
También llamar la atención sobre la funcionalidad set datefirts , el número que ponemos después influye en el número que devuelve el datepart(wd,..), es decir, si queremos distinguir los sábados y los domingos debemos saber exactamente cual es el dia en el que comienza la semana, de ahí que nos aseguremos poniendo SET DATEFIRST 1, el SET LANGUAGE, es para que los nombres salgan en castellano.   Por lo demás el código es bastante sencillo.
En los próximos articulos seguiremos abundando en esta parte, también usaremos vistas, y por fin lo que haremos, será crear una tabla y rellenarla con varios idiomas. 
Y ahora el código que es lo que importa realmente.


  
set language spanish; 
set datefirst 1;
 
   
With MiPrimeraCTE (fecha)
 as 
( select cast(’20000101′ as datetime) Fecha
  union all
  select fecha+1 from MiPrimeraCTE where fecha < ’20101231′
 )
 select Fecha,
 CAST(CONVERT(varchar(10),fecha,112) as int) FechaKey,
YEAR(Fecha) as Año,
MONTH(Fecha) as Numero_Mes,
DATENAME(month,fecha) Mes_Castellano,
DATENAME(month,fecha) +‘ ‘+ cast(YEAR(fecha) as varchar(4)) Mes_ao_Castellano,
year(fecha)*100+month(fecha) MesKey,
DATEPART(DW,fecha) Semana,
year(FEcha)*100 + DATEPART(DW,fecha) SemanaKey,
cast(DAY(fecha) as varchar(10)) + ‘ de ‘ + DATENAME(MM,fecha) + ‘ de ‘ + cast(YEAR(fecha) as varchar(4)) Fecha_Castellano,
case when datepart(weekday,fecha)>5 then ‘Fin de semana’ else ‘Semana’ end TipoDia,
datepart(dayofyear,fecha) DiaDelAo,
DATEPART(DW,fecha) DiaDeLaSemana,
DATEPART(dd,fecha) DiaDelMes,
DATENAME(dw,fecha) Dia_castellano
FROM MiPrimeraCTE option(maxrecursion 0) 
 
 
Â
Saludos Cordiales, Miguel Egea

Write a comment