devgameschool

Como filtrar um intervalo de datas com BETWEEN no SQL?

O BETWEEN pega uma faixa, de tanto a tanto, sem você escrever duas comparações. E como o SQLite não tem tipo de data — data ali é texto —, é neste capítulo que mora a armadilha de hora e de formato.

Como se escreve

WHERE <coluna> BETWEEN <início> AND <fim>;
WHERE <coluna> NOT BETWEEN <início> AND <fim>;

É o mesmo que escrever coluna >= início AND coluna <= fim. As duas pontas entram.

Exemplo para rodar

Para datas, o manual usa uma tabelinha vizinha da livro: emprestimo, com as colunas livro, retirado_em, leitor e dias.

Todos os exemplos usam duas tabelinhas: livro (titulo, autor, ano, paginas) e emprestimo (livro, retirado_em, leitor, dias).

SELECT livro, retirado_em FROM emprestimo
WHERE retirado_em BETWEEN '2026-03-01' AND '2026-03-31';
livro retirado_em
Vidas Secas 2026-03-02
O Cortiço 2026-03-15
A Hora da Estrela 2026-03-31
3 linhas no resultado

Dicas

  • O BETWEEN inclui as duas pontas: o dia 1 e o dia 31 estão dentro.
  • O início vem antes do fim. Trocado, não dá erro: dá nenhuma linha.
  • Data é texto no formato AAAA-MM-DD, e é justamente por isso que ela compara e ordena direito — o ano vem primeiro, depois o mês, depois o dia. Escrita como 31/03/2026, ela ordenaria pelo dia, e ninguém quer isso.
  • Quando a coluna guarda a hora junto, como em 2026-03-31 14:20, o BETWEEN '2026-03-01' AND '2026-03-31' deixa de fora tudo que aconteceu depois da meia-noite do dia 31, porque o texto com hora é maior que o texto sem hora. O conserto é pedir até antes do dia seguinte: retirado_em >= '2026-03-01' AND retirado_em < '2026-04-01'.
  • BETWEEN também vale para número: paginas BETWEEN 180 AND 250.

Erros comuns

Você escreveu
SELECT livro FROM emprestimo WHERE retirado_em BETWEEN '2026-03-31' AND '2026-03-01';
O SQLite respondeu
Nenhum erro, e nenhuma linha.
Como consertar
As pontas estão invertidas. A menor vem primeiro.
Você escreveu
SELECT livro FROM emprestimo WHERE retirado_em BETWEEN 2026-03-01 AND 2026-03-31;
O SQLite respondeu
Nenhum erro, e nenhuma linha.
Como consertar
Sem aspas, aquilo virou conta: 2026 menos 3 menos 1 dá 2022, e a faixa passou a ser de 2022 a 1992. Pior que isso, no SQLite qualquer texto é maior que qualquer número, então nenhuma data cairia na faixa de jeito nenhum. Data é texto, vai entre aspas simples.
Você escreveu
SELECT livro FROM emprestimo WHERE retirado_em BETWEEN '2026-03-01' '2026-03-31';
O SQLite respondeu
near "'2026-03-31'": syntax error
Como consertar
Faltou o AND no meio do BETWEEN.

Veja também

Onde isso aparece no jogo

No jogo Delegacia SQL, BETWEEN é o que resolve o inquérito 006, "Entre sete e nove". SISPOL, que aparece nas dicas, é o computador da delegacia do jogo.

Jogar Delegacia SQL