martes, 15 de enero de 2013

Crear una tabla de días festivos de Colombia

He visto la necesidad de tener una tabla de datos de fechas, donde indique atributos de cada una de las fechas e indique si es o no un día sábado, domingo o festivo en Colombia.

A continuación les mostrare como crear una estructura de datos (tabla) en el motor SQL Server para poder identificar si una fecha en particular es o no un día festivo en Colombia.

1. Crear tablas

Lo primero que se debe hacer es crear las tablas que se necesitaran para este proceso, para esto descargue el archivo Script Tablas.sql

Este script crea dos tablas.

  • Tiempo: esta tabla es el resultado final, en esta se mostraran las fechas y si es un día hábil (incluidos los festivos) o no.
  • Fechas: Son las fechas del 01 de enero de 2005 al 31 de diciembre de 2030.


Una vez creadas las tablas en la base de datos, descargue y ejecute el script de inserción de días festivos del archivo InsercionDiasFestivos.sql

2. Insertar registros en la tabla tiempo

A continuación ejecute el siguiente script o descarguelo, este insertará las fechas desde el 01 de enero de 2005 hasta el 31 de diciembre de 2030, y marcará los días sábados, domingos y festivos de Colombia como días no hábiles.


--Asignacion de lenguage de la sesion de base de datos
SET LANGUAGE SPANISH

--Fecha inicial desde la cual se va a crear la tabla con los dias festivos
DECLARE @fecha AS DATETIME
SET @fecha = '2005-01-01 00:00:00.000'

--Se eliminan datos de la tabla de Fechas
TRUNCATE TABLE Tiempo

IF EXISTS(SELECT name FROM sysobjects WHERE name = N'Fechas' AND xtype='U')
      DROP TABLE Fechas
create table Fechas
( fecha datetime )

-- Se inserta las fechas desde 2005-01-01 hasta 2018-12-31
while (@fecha < '2031-01-01 00:00:00.000')
begin
      INSERT      INTO fechas
      SELECT      @fecha
      SELECT      @fecha = @fecha +1
END

--Se declara cursor para generar la insercion de datos en la tabla tiempo
DECLARE fechas_cursor CURSOR FOR
SELECT      Fecha 
FROM  Fechas

OPEN fechas_cursor

FETCH NEXT FROM fechas_cursor
INTO @fecha

WHILE @@FETCH_STATUS = 0
BEGIN
      INSERT      INTO tiempo
      SELECT      @fecha Fecha,
                  YEAR(@fecha) as Año,
                  month(@fecha) as Mes,
                  day(@fecha) as Dia,
                  DATENAME(mm, @FECHA) MesNombre,
                  DATENAME(dw, @FECHA) DiaNombre,
                  datepart(dy,@fecha) as DiaAño,
                  convert(varchar(10),datepart(wk,@fecha)) SemanaAño,
                  CASE WHEN MONTH(@fecha)<=THEN '1' ELSE '2' END Semestre,
                  CASE WHEN MONTH(@fecha)<=THEN '1'
                         WHEN MONTH(@fecha)<=THEN '2'
                         WHEN MONTH(@fecha)<=THEN '3'
                         WHEN MONTH(@fecha)<= 12 THEN '4' END Trimestre,
                  case WHEN MONTH(@fecha)<=THEN '1'
                         WHEN MONTH(@fecha)<=THEN '2'
                         WHEN MONTH(@fecha)<= 12  THEN '3'END Cuatrimestre,
                  CASE WHEN DATEPART(DW, @fecha) = 6 THEN 0 -- Se marca el dia sabado como dia no habil
                         WHEN DATEPART(DW, @fecha) = 7 THEN 0 -- Se marca el dia domingo como dia no habil
                         ELSE 1 END DiaHabil

      FETCH NEXT FROM fechas_cursor
      INTO @fecha
END
CLOSE fechas_cursor;
DEALLOCATE fechas_cursor;


-- Se marcan los dias festivos como dias no habiles
UPDATE      tiempo SET diahabil = 0
FROM  TIEMPO T
            INNER JOIN FESTIVOS F ON Convert(varchar(10),T.fecha,101) = Convert(varchar(10),F.[Fecha],101)


--Eliminar tabla temporal
IF EXISTS(SELECT name FROM sysobjects WHERE name = N'Fechas' AND xtype='U')
      DROP TABLE Fechas

3. Resultado final

Ahora podrá realizar la selección de los registros de la tabla creada.

--Resultado final
select * from tiempo


Tabla tiempo
Tabla Tiempo