Function calcula horas utéis

581 views
Skip to first unread message

Thiago Pimenta

unread,
Jan 16, 2014, 7:51:34 AM1/16/14
to sqlse...@googlegroups.com
Bom dia galera,

Alguém já precisou fazer uma function pra calcular a diferença de horas entre duas datas? Detalhe, não pode calcular as horas de sábado, domingo e feriado (Para saber quando é feriado tenho uma tabela com o dia do feriado).
As horas dos dias úteis devem ser calculadas apenas no horário comercial (08:00 as 19:00).

--
Atenciosamente,

Thiago Pimenta
Administrador de Dados SQL Server
(61) 8141-7331

MTA


Advaldo de Paiva Moreira

unread,
Jan 16, 2014, 7:57:21 AM1/16/14
to sqlse...@googlegroups.com
Fiz um para calculo de horas:


if exists (select 1 from sys.objects where name = 'fn_ContaHoras' and type ='FN')
DROP FUNCTION fn_ContaHoras
GO

CREATE function fn_ContaHoras (
@dt_inicio smalldatetime,
@dt_final smalldatetime
)

returns varchar(max)
as

begin
DECLARE @fimdesemana INT
DECLARE @i INT

SELECT @fimdesemana = 0, @i = 0 
WHILE (DATEDIFF(day, @dt_inicio, @dt_final) > @i) begin
SELECT @i = @i + 1
IF (DATEPART(WEEKDAY, DATEADD(day, @i, @dt_inicio)) in (1,7)) 
BEGIN
SELECT @fimdesemana = @fimdesemana + 1
END
END

declare @dia numeric(30),@hora numeric(30), @minuto numeric(30)

SELECT @dia =    DATEDIFF(d, @dt_inicio, @dt_final) 
SELECT @hora =    DATEDIFF(hour, @dt_inicio, @dt_final) 
select @minuto =  DATEDIFF(MINUTE, @dt_inicio, @dt_final) 
if @dia > 0 
begin
SET @fimdesemana = (@fimdesemana * 8)
SET @hora = @hora - (@dia * 24) - @fimdesemana
SET @dia = @dia * 10


end
-- return @hora+@dia
return 
convert(varchar(max),(@hora +@dia)) +':'+convert(varchar(max),(@minuto %60))


end
GO

Veja se lhe ajuda.



--
 
---
You received this message because you are subscribed to the Google Groups "SQLServerDF" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlserverdf...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Advaldo de Paiva Moreira

unread,
Jan 16, 2014, 8:00:03 AM1/16/14
to sqlse...@googlegroups.com
Complementando, achei este script também:

/*
ALTER FUNCTION fn_ContaHoras (@inicio datetime, @final datetime)

RETURNS varchar(MAX)

AS
*/
/*****************************************************

CONTA AS HORAS ÚTEIS ENTRE A DATA INICIAL (@INICIO)
E A DATA FINAL (@FINAL)

*****************************************************/

select dateadd(day,-1,(dateadd(month,1,convert(char(08),getdate(),126)+'01')))

declare @inicio SMALLDATETIME
declare @final SMALLDATETIME

declare @inicio_dia SMALLDATETIME
declare @final_dia SMALLDATETIME

BEGIN
DECLARE @hour VARCHAR(MAX)

DECLARE @i INT
DECLARE @minutos VARCHAR(300)
DECLARE @fimdesemana INT

-- DEFINE A DATA Q DEVEIRA TERMINAR
SELECT @inicio = '2013-05-28 07:00:00.000'
-- DEFINE A DATA Q TERMINOU DE FATO
SELECT @final = '2013-06-01 10:00:00.000'


-- select @inicio = CONVERT(varchar(12), @inicio, 112)
-- select @inicio + '18:00:00'

SELECT @inicio_dia = CONVERT(varchar(12), @inicio, 112) 
SELECT @inicio_dia = (@inicio_dia  + '18:00:00' ) 


SELECT @final_dia = CONVERT(varchar(12), @final, 112) 
SELECT @final_dia = (@final_dia  + '08:00:00' ) 


-- CONTA OS DIAS UTEIS ENTRE AS DATAS
SELECT @fimdesemana = 0, @i = 0 
WHILE (DATEDIFF(day, @inicio, @final) > @i) begin
SELECT @i = @i + 1
IF (DATEPART(WEEKDAY, DATEADD(day, @i, @inicio)) in (1,7)) 
BEGIN
SELECT @fimdesemana = @fimdesemana + 1
END
END

declare @horainicio int
declare @horafim int
declare @horadias int

select  (datediff(MINUTE,@inicio, @inicio_dia)/60)
select (datediff(MINUTE,@final_dia, @final)/60)
select @fimdesemana


return

SELECT (DATEDIFF(HOUR,@inicio, @final) 
(@fimdesemana * 24)
  ) as calc
END




2014/1/16 Advaldo de Paiva Moreira <adjun...@googlemail.com>
Reply all
Reply to author
Forward
0 new messages