1. Introdução
O operador BETWEEN no MySQL é um recurso conveniente que permite recuperar dados dentro de um intervalo de datas específico usando uma consulta simples. Por exemplo, é útil ao obter dados de vendas mensais ou ao buscar usuários cujas datas de registro estejam dentro de um determinado período.
Entretanto, ao usar BETWEEN, é preciso prestar atenção em como tipos de dados como DATE e DATETIME são tratados, bem como possíveis problemas de desempenho. Neste artigo, explicaremos tudo, desde o uso básico até técnicas avançadas, em detalhes.
2. Conceitos Básicos do Operador BETWEEN do MySQL
2.1 Sintaxe Básica do BETWEEN
O operador BETWEEN é usado para recuperar valores dentro de um intervalo especificado. Ele possui a seguinte sintaxe básica:
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
Esta consulta recupera dados onde order_date está de 1 de janeiro de 2024 a 31 de janeiro de 2024. Um ponto importante é que BETWEEN inclui tanto a data de início quanto a data de término.
2.2 BETWEEN vs. Operadores de Comparação (>= E <=)
Para obter o mesmo resultado, você também pode combinar operadores de comparação como >= e <=.
SELECT * FROM orders
WHERE order_date >= '2024-01-01' AND order_date <= '2024-01-31';
Vantagens do BETWEEN:
- Sintaxe simples com alta legibilidade
Vantagens do >= E <=:
- Permite controle mais preciso das condições de intervalo (por exemplo, excluindo horários específicos)
Por exemplo, ao usar BETWEEN em uma coluna DATETIME, a inclusão da informação de horário pode resultar na recuperação de dados não intencionados. Explicaremos isso em detalhes na próxima seção.
3. Considerações Importantes ao Usar BETWEEN
3.1 Manipulação de Colunas que Incluem Informação de Horário
Usar BETWEEN em uma coluna DATETIME pode produzir resultados inesperados.
SELECT * FROM users
WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';
Nesta consulta, apenas os dados até 2024-01-31 00:00:00 são recuperados, o que significa que registros criados após a meia-noite de 31 de janeiro são excluídos.
3.2 Forma Correta de Especificar Intervalos de Datas
Para resolver esse problema, uma abordagem eficaz é definir a data de término como menor que o dia seguinte.
SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';
Ao usar >= e < dessa forma, você pode recuperar de maneira confiável todos os registros de todo o dia 31 de janeiro.

4. BETWEEN e Otimização de Desempenho
4.1 Relação entre Índices e BETWEEN
O operador BETWEEN funciona de forma eficiente quando índices apropriados estão configurados. Contudo, se você usar a função DATE(), o índice pode não ser utilizado, sendo necessária cautela.
-- Index will not be used (not recommended)
SELECT * FROM users
WHERE DATE(created_at) BETWEEN '2024-01-01' AND '2024-01-31';
Consulta recomendada:
SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';
4.2 Otimização de Consulta Usando EXPLAIN
Para verificar o desempenho, é útil usar o comando EXPLAIN.
EXPLAIN SELECT * FROM users WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';
Isso permite que você verifique os índices utilizados e o plano de execução.
5. Erros Comuns e Como Corrigi-los
5.1 Recuperando um Intervalo Não Intencional com BETWEEN
Mesmo ao usar BETWEEN, dados não intencionais podem ser incluídos ou excluídos se a informação de horário não for considerada. Como boa prática, recomenda‑se combinar >= e <.
5.2 Consultas que Desativam Índices
Condições que utilizam funções como DATE() ou CAST() podem desativar o uso de índices. Sempre que possível, o ideal é reescrever a consulta para comparar os valores diretamente.
6. Perguntas Frequentes (FAQ)
Q1: O BETWEEN inclui tanto a data de início quanto a data de término?
→ Sim, BETWEEN inclui ambas as fronteiras do intervalo especificado.
Q2: Devo usar BETWEEN ou >= E <=?
→ Use BETWEEN para condições de intervalo simples. Se você precisar considerar informações de tempo, >= AND < é recomendado.
Q3: Usar BETWEEN pode tornar uma consulta mais lenta?
→ Se você usar funções como DATE() ou CAST(), os índices podem não ser usados. Comparações diretas são recomendadas.
7. Consultas de Amostra Práticas para Uso no Mundo Real
7.1 Recuperar Dados para um Mês Específico
WHERE created_at BETWEEN '2024-02-01' AND '2024-02-28';
7.2 Recuperar Dados de Hoje
WHERE created_at BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY;
7.3 Recuperar Dados dos Últimos 30 Dias
WHERE created_at BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE();
8. Resumo
- O operador
BETWEENpermite a especificação simples de intervalos de datas , mas é necessário cuidado extra ao lidar com tiposDATETIME. BETWEENinclui tanto as datas de início quanto de fim , por isso a definição correta do intervalo é essencial.- A utilização de índices é crítica para a otimização de desempenho , e o uso da função
DATE()deve ser evitado. - Usar
>= AND <permite uma especificação de intervalo mais confiável .
Isso conclui nossa explicação dos pontos principais ao usar o operador BETWEEN no MySQL. Esperamos que isso ajude você no desenvolvimento no mundo real!


