Calculando dias úteis utilizando SQL
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:
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;