04/06/2007, 15:25
|
| Colaborador | | Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 20 años Puntos: 38 | |
Re: operaciones con fechas días hábiles
Código:
Drop table tmpRangosFechas
go
-- =============================================
-- Generate Test Info
-- =============================================
Create table tmpRangosFechas (id int identity(1,1), descripcion varchar(20), FechaI datetime, FechaF datetime)
Insert into tmpRangosFechas(descripcion, FechaI, FechaF) Values ('Carnavales','20060227','20060228')
Insert into tmpRangosFechas(descripcion, FechaI, FechaF) Values ('Carnavales2','20060410','20060419')
Insert into tmpRangosFechas(descripcion, FechaI, FechaF) Values ('Carnavales2','20070601','20070605')
-- =============================================
-- Create scalar function (FN)
-- =============================================
IF EXISTS (SELECT * FROM sysobjects WHERE name = N'fnQtyDays')
DROP FUNCTION fnQtyDays
GO
CREATE FUNCTION dbo.fnQtyDays(
@pFechaI datetime
,@pFechaF datetime)
RETURNS int
AS
BEGIN
Declare @Cuenta int
,@dtFechaI datetime
,@dtFechaF datetime
Declare @tblRangos Table (ValFecha datetime)
declare @dateFirst int
set @dateFirst = 1
Set @dtFechaI = convert(datetime, convert(varchar, @pFechaI, 112))
Set @dtFechaF = convert(datetime, convert(varchar, @pFechaF, 112))
While @dtFechaI <= @dtFechaF
Begin
Insert into @tblRangos (ValFecha) Values (@dtFechaI)
Set @dtFechaI = dateadd(d, 1, @dtFechaI)
End
Select @Cuenta = count(*) - 1
From @tblRangos r
Left outer join
tmpRangosFechas f (nolock)
On r.ValFecha between f.FechaI and f.FechaF
Where f.FechaI is null And
DatePart(dw, r.ValFecha) <> (7 - @@DateFirst + (7*(@@Datefirst/7))) And -- Que no sea Sabado
DatePart(dw, r.ValFecha) <> (8 - @@DateFirst) -- Que no sea Domingo
return isnull(@Cuenta,0)
END
GO
-- =============================================
-- Example to execute function
-- =============================================
SELECT dbo.fnQtyDays('20060226', '20060301') DiasHabiles
-- DiasHabiles
-- -----------
-- 2
GO
SELECT dbo.fnQtyDays('20070608', '20070612') DiasHabiles
-- DiasHabiles
-- -----------
-- 3
GO
SELECT dbo.fnQtyDays('20070531', '20070615') DiasHabiles
-- DiasHabiles
-- -----------
-- 8
GO
__________________ La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications. |