Stored Procedure SQL Server generador de fechas

El siguiente Stored Procedure nos sirve para generar fechas hasta la fecha actual. Útil para rellenar una tabla de dimensión fecha (DIM_FECHA) con los campos:

id_data: idenfitificador de la fecha en integer (ejp: 20091001)

  • date: fecha en sql
  • dia: dia en integer
  • dia_text: texto del dia (ejp: Sábado)
  • mes: mes en integer
  • mes_text: mes en texto (Marzo)
  • anyo: año en integer
  • periode: período en integer (ejp: 200910)
CREATE PROCEDURE generar_dim_fecha
 
AS
 
BEGIN
 
SET NOCOUNT ON
 
SET XACT_ABORT ON
 
declare @Date smalldatetime,
 
@i int,
@id_data int,
@id_data_text varchar(50),
@dia int,
@dia_setmana int,
@dia_text varchar(50),
@mes int,
@mes_text varchar(50),
@anyo int,
@periode int,
@max_data_bd smalldatetime
 
SELECT @max_data_bd = isnull(max(DATA),'2008-01-01') FROM DIM_FECHA
 
SET @Date = '2008-01-01'
 
IF @max_data_bd > @Date SET @Date = dateadd(d,1,@max_data_bd)
 
SET @i = 1
 
while @date <= getDate()
 
begin
 
SET @id_data_text = CONVERT(varchar(8), @date, 112)
 
SET @periode = SUBSTRING(@id_data_text,1,6)
 
 SET @id_data = CONVERT(varchar(8), @date, 112)
 
SET @dia = SUBSTRING( @id_data_text,7,2)
 
 SET @mes = SUBSTRING( @id_data_text,5,2)
 
 SET @anyo = SUBSTRING( @id_data_text,1,4)
 
SET @dia_setmana = DATEPART ( dw ,@date)
 
 SET @dia_text =
 
CASE 
 
WHEN @dia_setmana = 1 THEN 'Domingo'
 
WHEN @dia_setmana = 2 THEN 'Lunes'
 
WHEN @dia_setmana = 3 THEN 'Martes'
 
WHEN @dia_setmana = 4 THEN 'Miércoles'
 
WHEN @dia_setmana = 5 THEN 'Jueves'
 
WHEN @dia_setmana = 6 THEN 'Viernes'
 
WHEN @dia_setmana = 7 THEN 'Sábado'
 
 END
 
SET @mes_text =
 
CASE
 
WHEN @mes = 1 THEN 'Enero'
 
WHEN @mes = 2 THEN 'Febrero'
 
WHEN @mes = 3 THEN 'Marzo'
 
WHEN @mes = 4 THEN 'Abril'
 
WHEN @mes = 5 THEN 'Mayo'
 
WHEN @mes = 6 THEN 'Junio'
 
WHEN @mes = 7 THEN 'Julio'
 
WHEN @mes = 8 THEN 'Agosto'
 
WHEN @mes = 9 THEN 'Septiembre'
 
WHEN @mes = 10 THEN 'Octubre'
 
WHEN @mes = 11 THEN 'Novembre'
 
WHEN @mes = 12 THEN 'Desembre'
 
END
 
/*PRINT @id_data
 
PRINT @dia
 
PRINT @dia_setmana
 
PRINT @dia_text
 
PRINT @mes
 
PRINT @mes_text
 
PRINT @anyo
 
PRINT @periode*/
 
INSERT DIM_FECHA
 
 (id_data, DATA, dia,dia_text,mes,mes_text,anyo,periode)
 
VALUES (@id_data,@date,@dia, @dia_text, @mes, @mes_text, @anyo, @periode)
 
 SET @i = @i + 1
 
 SET @Date = DateAdd(d, 1, @Date)
 
end
 
END