Como localizar datas consecutivas com SQL

Como localizar datas consecutivas com 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:

 

Trabalhando com datas no SQL

 

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

 

 

Outros conteudos que podem ser de seu interesse

Como localizar queries lentas no SQL Server
23/09/2019SQL

Como localizar queries lentas no SQL Server

Aprenda como localizar as queries que deixam o seu banco de dados lento

Saiba mais...
SQL vs DAX - Operações básicas
28/11/2021SQL

SQL vs DAX - Operações básicas

Um comparativo entre as operações básicas no SQL e seus equivalentes no DAX

Saiba mais...

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