Guia de Hora Atual no MySQL: NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, Configurações de Fuso Horário e Melhores Práticas

目次

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.

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT 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?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

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

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (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.

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT 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
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + 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

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

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 CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

Quando Usar TIMESTAMP vs DATETIME

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 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;