miércoles, 15 de agosto de 2018

Función SQL Server para calcular días hábiles,Contador De Dias Habiles

Sp Contador De Días Hábiles

CREATE FUNCTION [dbo].[DifDias](@fch_ini datetime, @fch_fin datetime)
RETURNS int
AS
BEGIN
DECLARE @TotalDias  DECIMAL(6,1) --Con esta variable calculamos cuantos dias "normales" hay en el rango de fechas
DECLARE @DiasNoLaborables INT --Con esta variable acumulamos los dias no laborables
DECLARE @DiasFeriados SMALLINT --Total dias feriados entre el rango de fechas
DECLARE @Cnt INT --esta variable nos sirve de contador para saber cuando lleguemos al ultimo dia del rango
DECLARE @EvalDate DATETIME --esta variable es la que comparamos para saber si el dia que esta calculando es sábado o domingo

SET @Cnt = 0
SET @DiasNoLaborables = 0
--Calculamos cuantos dias normales hay en el rango de fechas
SELECT @TotalDias = DATEDIFF(HOUR,@fch_ini,@fch_fin) / 24.0--Se maneja diferencia de dias a nivel horas
SELECT @DiasFeriados = COUNT(1) FROM Configuracion.DiasFestivos WHERE feFestiva >= @fch_ini AND feFestiva <= @fch_fin
WHILE @Cnt < @TotalDias
BEGIN
    SELECT @EvalDate = @fch_ini + @Cnt
    IF datepart(dw,@EvalDate) = 6 OR datepart(dw,@EvalDate) = 7
    BEGIN
        SET @DiasNoLaborables = @DiasNoLaborables + 1
    END
    SET @Cnt = @Cnt + 1
END
RETURN cast((@TotalDias - @DiasNoLaborables - @DiasFeriados) as int)
END

7 comentarios:

  1. DIsculpe la pregunta pero y esta tabla Configuracion.DiasFestivos ?

    ResponderEliminar
    Respuestas
    1. esta tabla es para incluir los días festivos de tu país y que no la tome en cuenta para el calculo de días laborables saludos

      Eliminar
    2. es:
      CREATE SCHEMA [Configuration]
      GO
      /****** Object: Table [Configuration].[DiasFestivos] Script Date: 21/05/2018 04:29:30 p. m. ******/
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      CREATE TABLE [Configuration].[DiasFestivos](
      [idDiaFestivo] [int] IDENTITY(1,1) NOT NULL,
      [dsDiaFestivo] [nvarchar](100) NULL,
      [feDia] [datetime] NULL,
      [esActivo] [bit] NULL,
      CONSTRAINT [PK_DIASFESTIVOS] PRIMARY KEY CLUSTERED
      (
      [idDiaFestivo] ASC
      )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
      ) ON [PRIMARY]
      GO
      ALTER TABLE [Configuration].[DiasFestivos] ADD DEFAULT ((0)) FOR [esActivo]
      GO
      EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Dias Festivos ' , @level0type=N'SCHEMA',@level0name=N'Configuration', @level1type=N'TABLE',@level1name=N'DiasFestivos'
      GO

      Eliminar
  2. muy bueno este codigo... funciona perfecto

    ResponderEliminar
  3. esta genial pero no se si tendrás unos igual pero con la hora laboral hábiles.

    ResponderEliminar
  4. Buen día, esta funcion tiene una ligera falla cuando el feriado cae fin de semana. Con esta corrección funcionaría mejor:
    SELECT @DiasFeriados = COUNT(1)
    FROM Configuracion.DiasFestivos
    WHERE (feFestiva >= @fch_ini AND feFestiva <= @fch_fin)
    and (datepart(dw, fecFestiva) < 6);

    ResponderEliminar
  5. esta publicacion esta un poco mas completa
    https://thedevelopmentstages.com/calcular-dias-laborables-en-sql/

    ResponderEliminar

Comenta cualquier duda o recomendatorio.