Como localizar datas consecutivas com SQL
Confira como localizar datas consecutivas utilizando SQL
Neste artigo vamos ver como resolver um problema com datas usando SQL. Você vai ver como detectar dias consecutivos. Vamos ver exemplos de como resolver isso no SQL Server e no MySQL
Primeiro vamos criar uma tabela com os dados que usaremos em nossa consulta. A tabela de matrículas vai ter um resumo das matrículas feitas durante uma certa data, agrupadas pelo código do curso.
SQL Server
CREATE TABLE matriculas (
id int IDENTITY(1,1) PRIMARY KEY,
curso int,
data date,
quantidade int
);
MySQL
CREATE TABLE matriculas (
id int NOT NULL AUTO_INCREMENT,
curso int,
data date,
quantidade int,
PRIMARY KEY (id)
);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-01', 35);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-02', 13);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-05', 18);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-06', 28);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-09', 7);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-12', 12);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-15', 22);
INSERT INTO matriculas (curso, data, quantidade) VALUES (1, '2024-02-16', 16);
INSERT INTO matriculas (curso, data, quantidade) VALUES (2, '2024-02-01', 5);
INSERT INTO matriculas (curso, data, quantidade) VALUES (2, '2024-02-05', 8);
INSERT INTO matriculas (curso, data, quantidade) VALUES (2, '2024-02-09', 7);
INSERT INTO matriculas (curso, data, quantidade) VALUES (2, '2024-02-12', 2);
INSERT INTO matriculas (curso, data, quantidade) VALUES (2, '2024-02-16', 6);
Com base nestes dados, podemos ver que tivemos matrículas em dias consecutivos nos dias 01 e 02, 05 e 06 e 15 e 16 de fevereiro para o curso 1. Para o curso 2 não houve matrículas em dias consecutivos. São estes os resultados que desejamos obter em nossa consulta
Para fazer isso vamos vincular a tabela com ela mesma usando o ID do curso como referência. Feito este vínculo, vamos filtrar por registros que sejam 1 dia maior ou menor do que a data do registro atual. Para fazer isso no SQL Server utilizamos a função DATEADD, que recebe 3 parâmetros, o tipo de adição que vamos fazer, em nosso caso dias, a quantidade e o valor que vai ser usado no cálculo da nova data.
No SQL Server a solução ficaria da seguinte forma:
Select * from matriculas a
inner join matriculas b
on a.curso = b.curso
and (a.data = DATEADD(day, 1, b.data) OR a.data = DATEADD(day, -1, b.data))
Já no MySQL a solução ficaria um pouco diferente. Apesar da lógica ser a mesma, a função que permite adicionar dias a uma data tem nome dirente. No MySQL usamos a função DATE_ADD que recebe 2 parâmetros, a data de referência e a quantidade de dias a adicionar ou remover.
Select * from matriculas a
inner join matriculas b
on a.curso = b.curso
and (a.data = DATE_ADD(b.data, INTERVAL 1 DAY) OR a.data = DATE_ADD(b.data, INTERVAL -1 DAY))
ENCERRAMENTO
Neste artigo você viu como localizar datas consecutivas com SQL.
Se você se interessa por operações com datas no SQL, pode se interessar pelos seguintes artigos:
Calcular a diferença entre horas utilizando SQL
Calculando a idade usando MySQL
Calculando a idade usando SQL Server
Calculando dias úteis utilizando SQL
Criando uma tabela calendário com SQL