quarta-feira, 10 de junho de 2009

Função para obter o próximo dia útil em T-SQL

Para determinar se uma data é um dia útil ou obter o próximo dia útil a partir de uma data, precisarmos criar uma pequena estrutura que será composta de uma tabela com todos os feriados e uma função, para determinar se a data que queremos comparar é um dia útil ou qual o próximo dia útil em relação a um feriado ou fim de semana.

Veja o script abaixo:

--crie a sua tabela com os feriados
create TABLE feriados(dtFeriado smalldatetime NOT NULL)

--inserindo alguns registros para teste
insert into feriados(dtferiado) values ('2009-06-10 19:32:00')
insert into feriados(dtferiado) values ('2009-06-11 19:32:00')

go

--criando a função que recebe como parametro uma data
--e verifica se a data passada é dia útil, se não for
--retorna o próximo dia útil
create function dbo.funRetornaDiaUtil (@PDtInicio smalldatetime)
RETURNS smalldatetime
AS
BEGIN
Declare @teste Int
Declare @DtInicio Datetime

set @DtInicio = @PDtInicio
set @teste = 0

--loop para encontrar o dia útil
while @teste=0
begin

if DatePart(WeekDay, @DtInicio) Not In (7,1)
/*muito importante o uso do floor para eliminar a hora da data, dê uma olhada no artigo
sobre este hack*/
and not exists(select cast(floor(cast(dtFeriado as float)) as datetime)
from feriados where cast(floor(cast(dtferiado as float)) as datetime)=cast(floor(cast(@DtInicio as float)) as datetime))
begin

set @teste = 1

end
else
select @DtInicio=DateAdd(day,1,@DtInicio)

end
RETURN @DtInicio
END

go


Agora vamos testar a função:
--testando a função...como '2009-06-11 19:32:00' e '2009-06-10 19:32:00'
--foram inseridos como feriados, o resultado será '2009-06-12 19:32:00'
select dbo.funRetornaDiaUtil('2009-06-10 19:32:00') AS TESTE


3 comentários:

Leave your comment here!