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
Este comentário foi removido pelo autor.
ResponderExcluirEste comentário foi removido por um administrador do blog.
ExcluirShow...
ResponderExcluir