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
DIsculpe la pregunta pero y esta tabla Configuracion.DiasFestivos ?
ResponderEliminaresta 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
Eliminares:
EliminarCREATE 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
muy bueno este codigo... funciona perfecto
ResponderEliminaresta genial pero no se si tendrás unos igual pero con la hora laboral hábiles.
ResponderEliminarBuen día, esta funcion tiene una ligera falla cuando el feriado cae fin de semana. Con esta corrección funcionaría mejor:
ResponderEliminarSELECT @DiasFeriados = COUNT(1)
FROM Configuracion.DiasFestivos
WHERE (feFestiva >= @fch_ini AND feFestiva <= @fch_fin)
and (datepart(dw, fecFestiva) < 6);
esta publicacion esta un poco mas completa
ResponderEliminarhttps://thedevelopmentstages.com/calcular-dias-laborables-en-sql/