- 1 1. Introdução
- 2 2. Como Obter a Hora Atual no MySQL
- 3 3. Como FormatAR a Hora Atual no MySQL
- 4 4. Cálculos de Data/Hora Usando o Horário Atual no MySQL
- 5 5. Configurações de Fuso Horário no MySQL
- 6 6. Como Definir o Horário Atual como Valor Padrão no MySQL
- 7 7. Erros Comuns do MySQL e Soluções (FAQ)
- 8 8. Melhores Práticas para Manipular o Horário Atual no MySQL
1. Introdução
Quando Você Precisa Manipular a Hora Atual no MySQL?
No MySQL, obter a hora atual é necessário em muitas situações diferentes. Por exemplo, os seguintes casos de uso são comuns:
- Inserir automaticamente um timestamp ao registrar dados
- Por exemplo, registrar a data e hora de criação ao salvar dados de pedidos ou logs.
- Filtrar dados com base na hora atual
- Por exemplo, recuperar apenas dados dos últimos 7 dias ou buscar registros com datas futuras.
- Formatar datas e horas para exibição
- Formatar valores de data e hora para melhor legibilidade ao gerar relatórios.
- Gerenciar expiração de dados usando a hora atual
- Por exemplo, determinar se um cupom ainda é válido comparando‑o com a hora atual.
Como você pode ver, obter e manipular corretamente a hora atual no MySQL é uma habilidade importante na administração de bancos de dados.
O Que Você Vai Aprender Neste Artigo
Este artigo explica os seguintes tópicos em detalhe:
- Como obter a hora atual no MySQL (
NOW(),CURRENT_TIMESTAMP, etc.) - Como alterar formatos de data e hora (usando
DATE_FORMAT()) - Cálculos de data e hora usando a hora atual (usando
INTERVAL) - Como mudar o fuso horário (
SET SESSION time_zone) - Usar a hora atual como valor padrão (
CURRENT_TIMESTAMP) - Erros comuns e como corrigi‑los (FAQ)
Do básico ao uso avançado da manipulação da “hora atual” no MySQL, este guia fornece exemplos práticos de SQL. Certifique‑se de ler até o final.
2. Como Obter a Hora Atual no MySQL
Lista de Funções para Obter a Hora Atual no MySQL
O MySQL oferece várias funções para obter a hora atual. Entenda as diferenças e use‑as adequadamente.
| Function | Returns | Example |
|---|---|---|
NOW() | Current date and time (date + time) | SELECT NOW(); → 2025-02-11 16:00:00 |
CURRENT_TIMESTAMP | Same as NOW() (SQL standard) | SELECT CURRENT_TIMESTAMP; |
CURDATE() | Current date only | SELECT CURDATE(); → 2025-02-11 |
CURTIME() | Current time only | SELECT CURTIME(); → 16:00:00 |
Função NOW()
NOW() é a função mais usada no MySQL para obter a hora atual.
Ela devolve tanto a data quanto a hora.
SELECT NOW();
Exemplo de saída:
2025-02-11 16:00:00
NOW()devolve a hora atual do sistema.- Como ela é afetada pelo fuso horário, a hora exibida pode variar dependendo do seu ambiente (explicado em detalhe na seção “Configurações de Fuso Horário”).
Como Usar CURRENT_TIMESTAMP
CURRENT_TIMESTAMP se comporta quase da mesma forma que NOW(). Ela segue o padrão SQL e também pode ser usada em outros bancos de dados.
SELECT CURRENT_TIMESTAMP;
Exemplo de saída:
2025-02-11 16:00:00
Obter Apenas a Data com CURDATE()
CURDATE() é usada quando você deseja obter apenas a data atual (ano, mês, dia).
SELECT CURDATE();
Exemplo de saída:
2025-02-11
Obter Apenas a Hora com CURTIME()
Se você quiser obter apenas a hora atual (hora, minuto, segundo), use CURTIME().
SELECT CURTIME();
Exemplo de saída:
16:00:00
Qual Função Você Deve Usar?
| Purpose | Recommended Function |
|---|---|
| Retrieve both date and time | NOW() or CURRENT_TIMESTAMP |
| Retrieve date only | CURDATE() |
| Retrieve time only | CURTIME() |
3. Como FormatAR a Hora Atual no MySQL
Formatação Personalizada com DATE_FORMAT()
Sintaxe Básica de DATE_FORMAT()
No MySQL, você pode usar a função DATE_FORMAT() para mudar livremente o formato de datas e horas.
SELECT DATE_FORMAT(datetime_value, 'format_specifiers');
Exemplo: Converter NOW() para o formato YYYY/MM/DD HH:MM
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');
Saída:
2025/02/11 16:45
Lista de Especificadores de Formato Comuns
| Specifier | Meaning | Example (2025-02-11 16:45:30) |
|---|---|---|
%Y | 4-digit year | 2025 |
%m | 2-digit month (01-12) | 02 |
%d | 2-digit day (01-31) | 11 |
%H | Hour (00-23, 24-hour format) | 16 |
%i | Minutes (00-59) | 45 |
%s | Seconds (00-59) | 30 |
Extrair Apenas a Parte da Hora com TIME()
Se você quiser extrair apenas a parte da hora do datetime retornado por NOW(), use a função TIME().
SELECT TIME(NOW());
Saída:
16:45:30
Extrair Partes com YEAR(), MONTH() e DAY()
Para extrair apenas partes específicas, use as funções a seguir.
| Function | Returns | SQL | Output Example (2025-02-11 16:45:30) |
|---|---|---|---|
YEAR() | Year | SELECT YEAR(NOW()); | 2025 |
MONTH() | Month | SELECT MONTH(NOW()); | 2 |
DAY() | Day | SELECT DAY(NOW()); | 11 |
Exemplos Práticos de Formatação
O SQL a seguir é útil para experimentar vários formatos na prática.
SELECT
NOW() AS 'Original datetime',
DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
TIME(NOW()) AS 'Time only',
YEAR(NOW()) AS 'Year',
MONTH(NOW()) AS 'Month',
DAY(NOW()) AS 'Day';

4. Cálculos de Data/Hora Usando o Horário Atual no MySQL
Adicionar/Subtrair com INTERVAL
Sintaxe Básica
SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;
Adicionar Tempo Baseado em NOW()
Por exemplo, para obter a data/hora “uma semana depois”:
SELECT NOW() + INTERVAL 7 DAY;
Exemplo de saída:
2025-02-18 16:30:00
| Unit | Meaning | Example |
|---|---|---|
| SECOND | Seconds | NOW() + INTERVAL 10 SECOND |
| MINUTE | Minutes | NOW() + INTERVAL 5 MINUTE |
| HOUR | Hours | NOW() + INTERVAL 2 HOUR |
| DAY | Days | NOW() + INTERVAL 10 DAY |
| MONTH | Months | NOW() + INTERVAL 3 MONTH |
Calcular a Diferença Entre Duas Datas com DATEDIFF()
SELECT DATEDIFF(NOW(), '2025-01-01');
Exemplo de saída:
30
Filtrar por um Intervalo de Datas com BETWEEN
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
5. Configurações de Fuso Horário no MySQL
Verificar o Fuso Horário Atual
SHOW VARIABLES LIKE '%time_zone%';
Exemplo de saída:
+------------------+----------------+
| Variable_name | Value |
+------------------+----------------+
| system_time_zone | UTC |
| time_zone | SYSTEM |
+------------------+----------------+
Alterar o Fuso Horário por Sessão
SET SESSION time_zone = 'Asia/Tokyo';
Alterar o Fuso Horário Padrão do Servidor
Adicione o seguinte ao arquivo de configuração (my.cnf):
[mysqld]
default_time_zone = 'Asia/Tokyo'
Obter Hora UTC com UTC_TIMESTAMP
SELECT UTC_TIMESTAMP();
Converter para Hora Local com CONVERT_TZ()
SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');
6. Como Definir o Horário Atual como Valor Padrão no MySQL
Definir CURRENT_TIMESTAMP como Valor Padrão
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Atualizações Automáticas com ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Diferença Entre DATETIME e TIMESTAMP
| Type | Affected by Time Zone | Can Set CURRENT_TIMESTAMP as Default |
|---|---|---|
TIMESTAMP | Yes | Yes |
DATETIME | No | No |
Por que Você Não Pode Usar NOW() como Valor Padrão e a Solução
ERROR 1067 (42000): Invalid default value for 'created_at'
Solução:
CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
7. Erros Comuns do MySQL e Soluções (FAQ)
Não é Possível Usar NOW() como Valor Padrão
Exemplo de Erro
CREATE TABLE logs (
created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'
Solução
CREATE TABLE logs (
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
O Horário CURRENT_TIMESTAMP Está Incorreto
SHOW VARIABLES LIKE 'time_zone';
Solução
SET SESSION time_zone = 'Asia/Tokyo';
Resultado de NOW() Está Deslocado em Uma Hora
SHOW VARIABLES LIKE 'system_time_zone';
Solução
SET GLOBAL time_zone = 'Asia/Tokyo';
Filtragem de Intervalo BETWEEN Não Funciona como Esperado
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';
Solução
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
8. Melhores Práticas para Manipular o Horário Atual no MySQL
Quando Usar NOW() vs CURRENT_TIMESTAMP
| Use Case | Recommended |
|---|---|
Retrieve the current time in a SELECT statement | NOW() |
Automatically set the current time during INSERT | CURRENT_TIMESTAMP |
Set as the default value of a TIMESTAMP column | CURRENT_TIMESTAMP |
Quando Usar TIMESTAMP vs DATETIME
| Data Type | Affected by Time Zone | Storage Size |
|---|---|---|
TIMESTAMP | Yes | 4 bytes |
DATETIME | No | 8 bytes |
Armazenar em UTC e Converter para Hora Local
SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');
Use >= e < ao invés de BETWEEN
SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00'
AND created_at < '2025-03-01 00:00:00';
Padronize o Uso de INTERVAL
SELECT NOW() + INTERVAL 1 DAY;
Limpe Adequadamente Dados Antigos
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;


