- 1 1. Introdução
- 2 2. Visão geral dos tipos de dados de data do MySQL
- 3 3. Como comparar datas
- 4 4. Calculando diferenças de datas
- 5 5. Adição e subtração de datas
- 6 6. Exemplos Práticos de Consulta
- 7 7. Otimização de Desempenho
- 8 8. FAQ (Perguntas Frequentes)
- 8.1 Q1: Qual é a diferença entre DATE e DATETIME?
- 8.2 Q2: O que devo observar ao especificar um intervalo de datas usando BETWEEN?
- 8.3 Q3: Como as diferenças de fuso horário devem ser tratadas?
- 8.4 Q4: Como posso recuperar dados dos últimos 30 dias?
- 8.5 Q5: Como posso melhorar o desempenho das comparações de datas?
- 9 9. Resumo
1. Introdução
Manipular datas no MySQL é um dos aspectos mais importantes das operações de banco de dados. Por exemplo, ao agregar dados de vendas por data ou buscar registros dentro de um período específico, a comparação de datas torna‑se essencial.
Este artigo explica tudo, desde os conceitos básicos de manipulação e comparação de datas no MySQL até casos de uso avançados e técnicas de otimização de desempenho. Ele foi criado para ser útil a usuários de todos os níveis, desde iniciantes até desenvolvedores intermediários.
2. Visão geral dos tipos de dados de data do MySQL
Tipos de tipos de dados de data e suas características
O MySQL oferece os seguintes três principais tipos de dados de data. Abaixo está uma breve explicação de cada um.
- DATE
- Valor armazenado: Ano‑Mês‑Dia (
YYYY-MM-DD) - Características: Não inclui informação de horário, tornando‑o adequado para gerenciar datas simples.
- Casos de uso: Aniversários, prazos.
- DATETIME
- Valor armazenado: Ano‑Mês‑Dia e Horário (
YYYY-MM-DD HH:MM:SS) - Características: Inclui informação de horário, tornando‑o adequado para registrar timestamps precisos.
- Casos de uso: Timestamps de criação, timestamps de última atualização.
- TIMESTAMP
- Valor armazenado: Ano‑Mês‑Dia e Horário (
YYYY-MM-DD HH:MM:SS) - Características: Dependente de fuso horário, sendo útil para gerenciar data e hora em diferentes regiões.
- Casos de uso: Dados de logs, registros de transações.
Como escolher o tipo de dado apropriado
- Se o horário não for necessário, escolha DATE.
- Se o horário for necessário, escolha DATETIME ou TIMESTAMP, dependendo dos requisitos de fuso horário da sua aplicação.
Consulta de exemplo
Abaixo está um exemplo usando cada tipo de dado.
CREATE TABLE events (
event_id INT AUTO_INCREMENT PRIMARY KEY,
event_date DATE,
event_datetime DATETIME,
event_timestamp TIMESTAMP
);
3. Como comparar datas
Usando operadores de comparação básicos
No MySQL, os seguintes operadores são usados para comparação de datas.
=(Igual)
- Recupera registros que correspondem à data especificada.
SELECT * FROM events WHERE event_date = '2025-01-01';
>/<(Maior que / Menor que)
- Busca registros antes ou depois da data especificada.
SELECT * FROM events WHERE event_date > '2025-01-01';
<=/>=(Menor ou igual / Maior ou igual)
- Busca dentro de um intervalo que inclui a data especificada.
SELECT * FROM events WHERE event_date <= '2025-01-10';
Consultas de intervalo usando BETWEEN
O operador BETWEEN permite especificar facilmente um intervalo de datas.
SELECT * FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';
Nota importante:
BETWEENinclui tanto o valor inicial quanto o final, portanto, certifique‑se de que nenhum dado necessário seja excluído inadvertidamente do seu intervalo.
4. Calculando diferenças de datas
Usando a função DATEDIFF
A função DATEDIFF() calcula a diferença (em dias) entre duas datas.
SELECT DATEDIFF('2025-01-10', '2025-01-01') AS days_difference;
Resultado:
- 9 dias
Usando a função TIMESTAMPDIFF
A função TIMESTAMPDIFF() permite calcular a diferença em unidades específicas, como anos, meses, dias ou horas.
SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-12-31') AS months_difference;
Resultado:
- 11 meses
5. Adição e subtração de datas
Manipulação de datas usando a cláusula INTERVAL
No MySQL, você pode facilmente adicionar ou subtrair tempo de uma data usando a cláusula INTERVAL. Isso permite criar consultas que recuperam datas antes ou depois de um período específico.
Adicionando a uma data
Exemplo de adição de tempo a uma data usando INTERVAL:
SELECT DATE_ADD('2025-01-01', INTERVAL 7 DAY) AS plus_seven_days;
Resultado:
2025-01-08
Subtraindo de uma data
Você pode subtrair tempo de uma data de forma semelhante usando INTERVAL:
SELECT DATE_SUB('2025-01-01', INTERVAL 1 MONTH) AS minus_one_month;
Resultado:
2024-12-01
Caso de Uso: Sistema de Lembretes
Abaixo está um exemplo de consulta que recupera eventos ocorridos exatamente sete dias atrás, que pode ser usado para enviar notificações automáticas de lembrete.
SELECT event_name, event_date
FROM events
WHERE event_date = DATE_SUB(CURDATE(), INTERVAL 7 DAY);
Cálculos Baseados na Data Atual
CURDATE(): Retorna a data atual (YYYY-MM-DD).NOW(): Retorna a data e hora atuais (YYYY-MM-DD HH:MM:SS).
Exemplo: Calcule a data uma semana a partir de hoje.
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS next_week;
6. Exemplos Práticos de Consulta
Recuperar Registros para uma Data Específica
Recupere eventos que correspondam à data especificada.
SELECT *
FROM events
WHERE event_date = '2025-01-01';
Recuperar Dados Dentro de um Intervalo de Datas
Exemplo de busca por eventos dentro de um intervalo de uma semana.
SELECT *
FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-07';
Agregando Dados por Data
Esta consulta conta quantos eventos estão registrados para cada mês.
SELECT MONTH(event_date) AS event_month, COUNT(*) AS total_events
FROM events
GROUP BY MONTH(event_date);
Resultado de Exemplo:
| event_month | total_events |
|---|---|
| 1 | 10 |
| 2 | 15 |
7. Otimização de Desempenho
Busca Eficiente Usando Índices
Definir um índice em uma coluna de data pode melhorar significativamente o desempenho da consulta.
Criando um Índice
O SQL a seguir cria um índice na coluna event_date.
CREATE INDEX idx_event_date ON events(event_date);
Verificando o Efeito de um Índice
Você pode usar EXPLAIN para verificar o plano de execução da consulta.
EXPLAIN SELECT *
FROM events
WHERE event_date = '2025-01-01';
Notas Importantes ao Usar Funções
Usar funções na cláusula WHERE pode desabilitar o uso de índices.
Exemplo Ruim
Na consulta a seguir, a função DATE() impede que o índice seja usado.
SELECT *
FROM events
WHERE DATE(event_date) = '2025-01-01';
Exemplo Melhorado
Recomenda-se comparar os valores diretamente sem usar funções.
SELECT *
FROM events
WHERE event_date >= '2025-01-01'
AND event_date < '2025-01-02';

8. FAQ (Perguntas Frequentes)
Q1: Qual é a diferença entre DATE e DATETIME?
- A1:
- DATE: Armazena apenas a data (
YYYY-MM-DD). Use-a quando a informação de horário não for necessária. - DATETIME: Armazena data e hora (
YYYY-MM-DD HH:MM:SS). Use-a quando for necessário o timestamp exato de um evento.
Exemplo:
CREATE TABLE examples (
example_date DATE,
example_datetime DATETIME
);
Q2: O que devo observar ao especificar um intervalo de datas usando BETWEEN?
- A2:
- Como o
BETWEENinclui tanto a data de início quanto a de fim, se a data final não incluir um valor de horário, você pode não recuperar todos os registros desejados.
Exemplo:
-- This query may not retrieve records such as "2025-01-31 23:59:59"
SELECT *
FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';
Melhoria:
Defina explicitamente o horário final para 23:59:59 ou use uma comparação que ignore a parte de horário.
SELECT *
FROM events
WHERE event_date >= '2025-01-01' AND event_date < '2025-02-01';
Q3: Como as diferenças de fuso horário devem ser tratadas?
- A3: No MySQL, o tipo
TIMESTAMPdepende do fuso horário. Em contraste, o tipoDATETIMEarmazena um valor fixo e não é afetado pelos fusos horários.
Verificar a configuração de fuso horário atual:
SHOW VARIABLES LIKE 'time_zone';
Alterar a configuração de fuso horário:
SET time_zone = '+09:00'; -- Japan Standard Time (JST)
Q4: Como posso recuperar dados dos últimos 30 dias?
- A4: Você pode combinar
CURDATE()ouNOW()comINTERVALpara recuperar dados dos últimos 30 dias.
Exemplo:
SELECT *
FROM events
WHERE event_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
Q5: Como posso melhorar o desempenho das comparações de datas?
- A5:
- Criar índices: Defina um índice nas colunas de data.
- Evitar usar funções: Usar funções na cláusula
WHEREpode desativar índices, portanto use comparações diretas.
9. Resumo
Pontos Principais deste Artigo
Este artigo forneceu uma explicação abrangente sobre técnicas de manipulação e comparação de datas no MySQL. Os principais aprendizados são os seguintes:
- Compreender as características e o uso adequado dos tipos de dados de data (DATE, DATETIME, TIMESTAMP).
- Métodos básicos de comparação (
=,>,<,BETWEEN, etc.). - Calcular diferenças de datas (
DATEDIFF(),TIMESTAMPDIFF()). - Melhorar o desempenho por meio de indexação e design de consultas otimizado.
Esperamos que este guia ajude você a lidar eficientemente com operações de data no MySQL e a desenvolver consultas práticas e otimizadas para aplicações do mundo real.


