Artigos SQL

Como criar uma função em SQL para calcular datas de vencimento levando em conta dias úteis e feriados

Boa noite pessoal.

Eu estava agora a pouco escrevendo uma procedure para um software em desenvolvimento que calculava a data de vencimento de reclamações dos clientes.

Se você trabalha com gestão financeira, sabe o quanto é importante ter um sistema que calcule as datas de vencimento corretamente. Imagine a frustração de um cliente ao receber uma cobrança com uma data incorreta ou que caia em um feriado, por exemplo.

Para evitar esse tipo de problema, é possível criar uma função em SQL que faça esse cálculo levando em conta dias úteis e feriados. Neste artigo, vamos mostrar passo a passo como criar essa função.

Primeiro, vamos definir os parâmetros que a função vai receber. São eles:

  • @dataAtual: a data atual, representada pelo tipo smalldatetime;
  • @quantidadeDias: a quantidade de dias a serem adicionados à data atual para se obter a data de vencimento, representada pelo tipo int;
  • @diasUteis: um parâmetro do tipo bit que indica se a opção de considerar apenas dias úteis está ativada ou não.

Com esses parâmetros definidos, podemos começar a criar a função. Vamos nomeá-la de “getVencimento”. Segue function comentada para facilitar o entendimento.

CREATE FUNCTION getVencimento (@dataAtual smalldatetime, @quantidadeDias int, @diasUteis bit)
RETURNS smalldatetime
AS
BEGIN
  -- Inicia a variável @diasAdicionais como zero e a variável @vencimento como a data atual somada à quantidade de dias informada.
  DECLARE @diasAdicionais int = 0
  DECLARE @vencimento smalldatetime = DATEADD(day, @quantidadeDias, @dataAtual)

  IF @diasUteis = 1 -- Verifica se a opção de dias úteis está ativa
  BEGIN
    WHILE @diasAdicionais < @quantidadeDias -- Loop para adicionar dias úteis à data de vencimento
    BEGIN
      SET @vencimento = DATEADD(day, 1, @vencimento) -- Adiciona um dia à data de vencimento
      IF DATENAME(weekday, @vencimento) NOT IN ('Saturday', 'Sunday') -- Verifica se o dia adicionado não é sábado ou domingo
      BEGIN
        IF NOT EXISTS (SELECT * FROM FERIADOS WHERE Data = @vencimento) -- Verifica se o dia adicionado não é um feriado cadastrado na tabela FERIADOS
        BEGIN
          SET @diasAdicionais = @diasAdicionais + 1 -- Incrementa a variável @diasAdicionais
        END
      END
    END
  END

  IF @diasUteis = 0 -- Verifica se a opção de dias úteis está desativada
  BEGIN
    WHILE @diasAdicionais < @quantidadeDias -- Loop para adicionar dias corridos à data de vencimento
    BEGIN
      SET @vencimento = DATEADD(day, 1, @vencimento) -- Adiciona um dia à data de vencimento
      SET @diasAdicionais = @diasAdicionais + 1 -- Incrementa a variável @diasAdicionais
    END
  END

  WHILE EXISTS (SELECT * FROM FERIADOS WHERE Data = @vencimento) -- Loop para verificar se a data de vencimento cai em um feriado cadastrado na tabela FERIADOS
  BEGIN
    SET @vencimento = DATEADD(day, 1, @vencimento) -- Adiciona um dia à data de vencimento
  END

  RETURN @vencimento -- Retorna a data de vencimento final
END

Agora, me diz ai, foi util para você ?

Se sim, deixe um comentário. Ajuda muito a incentivar nosso trabalho. E vamos codar!

 

 

Lucas Dalcolmo

About Author

Sou desenvolvedor de software a mais de 13 anos com experiência nacioanl e internacional. Já produzi softwares para grandes empresas no Brasil e também bancos em Portugal. Possuo as certificações microsoft AZ-900, DP-900, AI-900 e AZ-204 (azure developer associate). Sou fundador da Dallm Games Studio (@dallmgamesstudio) e fui mentor em vários eventos de desenvolvimento de jogos. Também fui mentor do NASA SPACE JAM 2024 na área de desenvolvimento de software.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Receba as últimas notícias por email

    Cadastre-se, receba nossas novidades em primeira mão por email, antes de todo mundo.

    Codeinsider @2025. Todos os direitos reservados.

    Desenvolvido por House Comunicação