Description
Properties
| Name | Value |
|---|---|
| ANSI Nulls ON | True |
| Quoted Identifier ON | True |
| Encrypted | False |
| Execute As | |
| Null on Null Input | False |
| Schema Bound | False |
| Assembly |
Parameters
3| Name | Data Type | Length | Description |
|---|---|---|---|
| (Result) | int | 4 | |
| @fch_ini | datetime | 8 | |
| @fch_fin | datetime | 8 |
SQL Script
Copy
SET QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
CREATE OR ALTER FUNCTION dbo.BusinessDays(@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 dbo.feriados WHERE fecha_feriado >= @fch_ini AND fecha_feriado <= @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
GO
GO
CREATE OR ALTER FUNCTION dbo.BusinessDays(@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 dbo.feriados WHERE fecha_feriado >= @fch_ini AND fecha_feriado <= @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
GO