none
Função Dias Úteis não funciona :(... RRS feed

  • 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

    quarta-feira, 18 de janeiro de 2012 11:09

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
    quarta-feira, 18 de janeiro de 2012 12:02
  • 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
      END

     

    Ainda 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
    quarta-feira, 18 de janeiro de 2012 12:08

Todas as Respostas

  • HolgerDavids, bom dia.

    Porque vc usa duas tabelas de feriados?

    Abs


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
    quarta-feira, 18 de janeiro de 2012 11:51
  • 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
    quarta-feira, 18 de janeiro de 2012 12:02
  • 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
      END

     

    Ainda 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
    quarta-feira, 18 de janeiro de 2012 12:08
  • 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....

    quarta-feira, 18 de janeiro de 2012 12:18