SQL

Calculando dias úteis utilizando SQL

03/04/2022SQL

Neste artigo vamos ver como podemos trabalhar com o cálculo de dias úteis utilizando o SQL. Vamos ver exemplos de como fazer isso utilizando SQL Server e MySQL

Para fazer isso, vamos criar uma tabela auxiliar que será um calendário contendo todas as datas de um determinado intervalo. Nesta tabela calendário, vamos marcar quais são os dias que consideramos úteis.

Criar uma tabela auxiliar para controlar os dias úteis facilita muito o nosso trabalho, já que dispensa a criação de funções. Devemos lembrar que temos feriados fixos, feriados com data variáveis, e dias em que por algum motivo não vamos trabalhar.  A tabela auxiliar economiza o nosso tempo.

Vamos ver como criar a nossa tabela auxiliar. Vamos criar a tabela com as datas e marcar os dias de segunda a sexta como dias úteis. Neste exemplo, a tabela vai conter todos as datas do ano de 2022. Começando pelo SQL Server:

 

 

CREATE TABLE calendario(

id int IDENTITY(1,1) PRIMARY KEY,

data date NULL,

dia int NULL,

mes int NULL,

ano int NULL,

dia_util int NULL,

feriado int NULL

)

 

Agora vamos criar um script para inserir nesta tabela as datas do período que vamos controlar. 

 

SET DATEFORMAT ymd

DECLARE @dataInicial datetime

DECLARE @dataFinal datetime

DECLARE @dia INT

DECLARE @mes INT

DECLARE @ano INT

DECLARE @dia_util INT

SET @dataInicial = '2021-12-31'

SET @dataFinal = '2022-12-31'

WHILE(@dataInicial < @dataFinal)

BEGIN

   SELECT @dataInicial = DATEADD(day, 1,@dataInicial)

   SELECT @dia = DAY(@dataInicial)

   SELECT @mes =  MONTH (@dataInicial)

   SELECT @ano =  YEAR (@dataInicial)

   IF DATEPART(dw, @dataInicial) IN (1,7) 

    SELECT @dia_util = 0 

    ELSE 

    SELECT @dia_util = 1

   

   INSERT INTO calendario (data, dia, mes, ano, dia_util, feriado) 

   SELECT @dataInicial, @dia, @mes, @ano, @dia_util, 0

END

 

 

Agora chegou a vez de mostrar como criar a mesma tabela auxiliar utilizando o MySQL

 

 

CREATE TABLE calendario (

id int NOT NULL AUTO_INCREMENT,

data DATE NOT NULL,

dia INTEGER NOT NULL,

mes INTEGER NOT NULL,

ano INTEGER NOT NULL,

dia_util INTEGER NOT NULL,

feriado INTEGER NOT NULL

 

Agora vamos criar uma função auxiliar chamada preencher_calendario para adicionar datas nesta tabela.

 

DELIMITER $

CREATE PROCEDURE preencher_calendario()

BEGIN

    DECLARE dataatual DATE;

    DECLARE datainicial DATE;

    DECLARE datafinal DATE;

    SET datainicial = '2021-12-31';

    SET datafinal = '2022-12-31';

    SET dataatual = datainicial;

    WHILE dataatual < datafinal DO

        INSERT INTO calendario VALUES (

        dataatual,

        DAY(dataatual),

        MONTH(dataatual),

        YEAR(dataatual),

        CASE DAYOFWEEK(dataatual) WHEN 1 THEN 0 WHEN 7 then 0 ELSE 1 END,

        0);

        SET dataatual = ADDDATE(dataatual,INTERVAL 1 DAY);

    END WHILE;

END

$

 

E por fim vamos executar a função auxiliar e dar carga na tabela.

 

CALL preencher_calendario();

 

Até agora, consideramos os dias de segunda a sexta como dias úteis. Precisamos agora adicionar os feriados. Para isso precisamos marcar o campo dia_util como 0 e o campo feriado como 1.

 

Para fazer isso, basta dar um update na tabela com base nas datas dos feriados. Vamos começar com as datas fixas:

 

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-01-01'; //Confraternização Universal

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-04-21'; //Tiradentes

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-05-01'; //Dia Mundial do Trabalho

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-09-07'; //Independência do Brasil

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-10-12'; //Nossa Senhora Aparecida

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-11-02'; //Finados

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-11-15'; //Proclamação da República

update calendario SET dia_util = 0, feriado = 1 WHERE data = '2022-12-25'; //Natal

 

Como eu comentei no começo deste artigo, temos feriados com data variável, como o Carnaval, Corpus Christi e Páscoa. Também devemos considerar em nossa tabela auxiliar os feriados estaduais ou municipais.

Para saber quais são as datas destes feriados, eu recomendo você consultar este site:

 

https://www.feriados.com.br

 

Agora que temos a tabela auxiliar pronta podemos fazer os nossos cálculos. Veja um exemplo de como calcular os dias úteis de um determinado intervalo de datas.

 

SELECT COUNT(*) as dias_uteis from calendario WHERE data BETWEEN '2022-01-01' and '2022-04-03' and dia_util = 1;

 

Outros conteudos que podem ser de seu interesse

Convertendo linhas em colunas no SQL Server usando PIVOT
07/02/2017SQL

Convertendo linhas em colunas no SQL Server usando PIVOT

Aprenda a transformar linhas em colunas no SQL Server

Saiba mais...
SQL vs Mongo - consultas com agrupamento
15/12/2019SQL

SQL vs Mongo - consultas com agrupamento

Veja exemplos de consultas com agrupamento no SQL e seus equivalentes no Mongo

Saiba mais...

Conteúdo sobre banco de dados sem complicação!

MySQL - Referência Rápida

 

SQL Server - Referência Rápida

 

SQL vs Mongo