Ver Mensaje Individual
  #10 (permalink)  
Antiguo 04/06/2007, 15:25
Avatar de Andres95
Andres95
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.