Usuário com melhor resposta
Função Dias Úteis não funciona :(...

Pergunta
-
Olá, fiz esta função com um objetivo: Tentar pegar os dias úteis de um mês calculando nisto: Feriados Federais e Feriados Municipais com estaduais...
CREATE FUNCTION [dbo].[fn_Real_DiasUteis] (@Filial VARCHAR(2),
@DataInicio DATETIME,
@DataFim DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @QtdeDias INT
DECLARE @Data DATE
SET @QtdeDias = 0
SET @Data = @DataInicio
WHILE @Data <= @DataFim
BEGIN
IF (Datepart(weekday, @Data) NOT IN ( 1, 7 ))
BEGIN
IF @Data NOT EXISTS (SELECT datferiado
FROM feriados)
BEGIN
IF @Data NOT EXISTS (SELECT datferiado
FROM realferiados)
BEGIN
SET @QtdeDias = @QtdeDias + 1;
END
END
END;
SET @Data = Dateadd(DAY, 1, @Data)
END
RETURN @QtdeDias
END
1) OBS: As tabelas Feriado e RealFeriado contem os Feriados que citei acima, uma os federais e outras os estaduais e municipais,2) Quando rodo a seguinte função: "SELECT dbo.fn_Real_DiasUteis ('01','2011-01-01','2011-01-31')" ele me diz que existem 21 dias úteis, quando na realidade existem 22!
3) Quando eu faço um DEBUG noto que dia 02 de janeiro ele não considera como dia ÚTIL!
Alguem consegue ver o meu erro?
Agradeço
Respostas
-
Bom dia HolgerDavids,
Olhando o calendario de 2011, o dia 02 de janeiro caiu em um domingo.
Acho que por isso não está sendo considerado dia útil.
Espero que ajude.
Assinatura: Imobiliarias em Suzano- Marcado como Resposta Holger Davids quarta-feira, 18 de janeiro de 2012 12:28
-
Estou debugando a sua função baseado no intervalo de data que vc está passando('01','2011-01-01','2011-01-31') e realmente neste período existem apenas 21 dias úteis. Somente o mês inteiro de janeiro de 2012 que possui 22 dias úteis, isto se não for em SP (25 de janeiro é feriado em sp).
A sua função está correta, mas de qualquer forma dei uma otimizada nela.
ALTER FUNCTION [dbo].[fn_Real_DiasUteis] (@Filial VARCHAR(2),
@DataInicio DATETIME,
@DataFim DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @QtdeDias INT
DECLARE @Data DATETIME
SET @QtdeDias = 0
SET @Data = @DataInicio
WHILE @Data <= @DataFim
BEGIN
IF (Datepart(weekday, @Data) NOT IN ( 1, 7 ))
and
@Data NOT in (SELECT datferiado FROM feriados)
and
@Data NOT in (SELECT datferiado FROM realferiados)
SET @QtdeDias = @QtdeDias + 1;SET @Data = Dateadd(DAY, 1, @Data)
END
RETURN @QtdeDias
ENDAinda mantenho o questionamento de ter duas tabelas para o controle de feriados.
Qualquer dúvida estou a disposição.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp- Marcado como Resposta Holger Davids quarta-feira, 18 de janeiro de 2012 12:27
Todas as Respostas
-
-
Bom dia HolgerDavids,
Olhando o calendario de 2011, o dia 02 de janeiro caiu em um domingo.
Acho que por isso não está sendo considerado dia útil.
Espero que ajude.
Assinatura: Imobiliarias em Suzano- Marcado como Resposta Holger Davids quarta-feira, 18 de janeiro de 2012 12:28
-
Estou debugando a sua função baseado no intervalo de data que vc está passando('01','2011-01-01','2011-01-31') e realmente neste período existem apenas 21 dias úteis. Somente o mês inteiro de janeiro de 2012 que possui 22 dias úteis, isto se não for em SP (25 de janeiro é feriado em sp).
A sua função está correta, mas de qualquer forma dei uma otimizada nela.
ALTER FUNCTION [dbo].[fn_Real_DiasUteis] (@Filial VARCHAR(2),
@DataInicio DATETIME,
@DataFim DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @QtdeDias INT
DECLARE @Data DATETIME
SET @QtdeDias = 0
SET @Data = @DataInicio
WHILE @Data <= @DataFim
BEGIN
IF (Datepart(weekday, @Data) NOT IN ( 1, 7 ))
and
@Data NOT in (SELECT datferiado FROM feriados)
and
@Data NOT in (SELECT datferiado FROM realferiados)
SET @QtdeDias = @QtdeDias + 1;SET @Data = Dateadd(DAY, 1, @Data)
END
RETURN @QtdeDias
ENDAinda mantenho o questionamento de ter duas tabelas para o controle de feriados.
Qualquer dúvida estou a disposição.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp- Marcado como Resposta Holger Davids quarta-feira, 18 de janeiro de 2012 12:27
-
Em primeiro lugar agradeço a atenção de todos...
Cara realmente, vocês estão todos certos...
Estava olhando a data errada....
Enfim, realidade as tabelas estão assim no banco, vou juntar as duas em uma só agora mesmo,
um MUITO OBRIGADO A TODOS
Bom dia....