Hora Atual no MySQL: NOW(), CURDATE(), UTC_TIMESTAMP(), Fusos Horários e Melhores Práticas

目次

1. Get the Current Time in MySQL (Bottom Line: Shortest SQL Cheat Sheet)

If you want to get the current time in MySQL, there are only a few SQL functions you need to remember.
Below is the shortest answer for the search keyword “MySQL get current time”.

1.1 MySQL current date and time: NOW() / CURRENT_TIMESTAMP

Returns the current date + time (YYYY-MM-DD HH:MM:SS).

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

Example output

2025-02-01 15:30:45
  • NOW() and CURRENT_TIMESTAMP usually return the same result.
  • Both return the current date and time.
  • If you need milliseconds, use the following.
    SELECT NOW(3);
    

Notes (common mistakes)

  • Depends on the server time zone setting.
  • In a UTC environment, you may get UTC instead of Japan time.
  • During query execution, it basically returns the same time (fixed within a single statement).

1.2 MySQL current date: CURDATE()

Returns only the date (no time).

SELECT CURDATE();

Example output

2025-02-01

Use cases

  • Query today’s data
  • Date comparisons (e.g., filter only today’s records)

Notes

  • The return value is a DATE type.
  • Not suitable when you need time-of-day processing.

1.3 MySQL current time: CURTIME()

Returns only the time.

SELECT CURTIME();

Example output

15:30:45

Use cases

  • Business hours checks
  • Branching logic by time window

Notes

  • Does not include date information.
  • Cannot be used to compare with DATE -type columns.

1.4 MySQL current UTC time: UTC_TIMESTAMP()

Returns the time in UTC (Coordinated Universal Time), regardless of the server time zone setting.

SELECT UTC_TIMESTAMP();

Example output

2025-02-01 06:30:45

When you should use it

  • Global services
  • Designs that store logs in UTC consistently

Common mistakes

  • Mixing it with NOW() causes time offsets
  • If the app assumes JST, you’ll see a 9-hour difference

1.5 MySQL current time with milliseconds: NOW(3) / CURRENT_TIMESTAMP(3)

MySQL 5.6 and later supports fractional seconds.

SELECT NOW(3);
SELECT CURRENT_TIMESTAMP(3);

Example output

2025-02-01 15:30:45.123

Notes for storing

Your column must also support fractional seconds.

DATETIME(3)
TIMESTAMP(3)

If you store it into a non-supported column, the fractional part will be truncated.

1.6 Quick cheat sheet by purpose

PurposeSQL
Current date and timeSELECT NOW();
Get UTCSELECT UTC_TIMESTAMP();
Date onlySELECT CURDATE();
Time onlySELECT CURTIME();
Get millisecondsSELECT NOW(3);

Common pitfalls summary

  • Time is offset because you didn’t verify the time zone
  • Using NOW(3) without a milliseconds-capable column
  • Mixing UTC and local time
  • Not understanding the difference between DATETIME and TIMESTAMP

MySQL DATETIME と TIMESTAMP の違いを示した図。TIMESTAMPはUTC変換され、DATETIMEは変換されない。

Difference between MySQL DATETIME and TIMESTAMP (comparing whether time zone conversion occurs)

2. Differences Between MySQL NOW() and CURRENT_TIMESTAMP

NOW() and CURRENT_TIMESTAMP look similar, but misunderstanding where to use them and how they behave can easily cause bugs. Here we整理 the differences, correct usage, and common pitfalls.

2.1 Which should you use? (SELECT usage / DEFAULT usage)

■ When retrieving the current date/time in SELECT

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

Normally, both return the same result.

  • They are equivalent (synonyms)
  • The return value is equivalent to DATETIME
  • Affected by the time zone setting

Practical takeaway

  • Prefer readability → NOW()
  • Prefer standard SQL style → CURRENT_TIMESTAMP

■ When setting a column default value

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

The key point here is:

For a default value, it’s common to use CURRENT_TIMESTAMP.

Alguns ambientes permitem NOW() também, mas o comportamento pode diferir dependendo da versão do MySQL e do modo SQL. A escolha mais segura é CURRENT_TIMESTAMP.

2.2 Uso correto de DEFAULT / ON UPDATE

Se você quiser atualizar automaticamente um timestamp “updated at”:

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
);

Comportamento

  • Em INSERT → define a hora atual para created_at / updated_at
  • Em UPDATE → atualiza apenas updated_at

Erros comuns

  • Não corresponder à precisão de frações de segundo ao usar DATETIME
  • Encontrar limitações de versões antigas do MySQL com múltiplas colunas TIMESTAMP (MySQL 5.6 e anteriores tinham restrições)

2.3 Diferenças entre NOW() e SYSDATE() (Importante)

O ponto fácil de perder é a diferença em relação ao SYSDATE().

SELECT NOW(), SYSDATE();

■ Diferenças de comportamento

  • NOW() → fixado no início da consulta
  • SYSDATE() → retorna a hora no momento em que é chamado

Exemplo:

SELECT NOW(), SLEEP(3), NOW();

NOW() retorna o mesmo valor.

SELECT SYSDATE(), SLEEP(3), SYSDATE();

SYSDATE() mostra uma diferença de 3 segundos.

2.4 Qual deles você deve usar?

FunctionBehaviorRecommended use
NOW()Fixed within a queryLogging, consistency-focused
SYSDATE()Call-time valuePrecise real-time retrieval

Por que NOW() é frequentemente recomendado em sistemas reais

  • Mantém a consistência dentro de uma transação (um mecanismo que processa múltiplas instruções SQL juntas)
  • Mais seguro em ambientes de replicação

2.5 Equívocos e problemas comuns

❌ “NOW() e CURRENT_TIMESTAMP são exatamente os mesmos, então você não precisa se preocupar com isso.”

→ Diferenças podem aparecer em valores padrão ou no comportamento de atualização, dependendo do ambiente.

❌ “SYSDATE() é mais preciso, então é sempre melhor.”

→ Pode causar problemas em ambientes de replicação.

❌ Não verificar o fuso horário

SHOW VARIABLES LIKE '%time_zone%';

Se você usá-lo sem verificar, pode obter desvios de horário.

2.6 Boas práticas recomendadas

  • Recuperação com SELECT → NOW()
  • Valor padrão da coluna → CURRENT_TIMESTAMP
  • Autoatualização → ON UPDATE CURRENT_TIMESTAMP
  • Foco em consistência → padrão NOW()
  • Design baseado em UTC → TIMESTAMP + armazenar em UTC
  1. MySQL Formatação da Hora Atual (DATE_FORMAT / TIME_FORMAT)
    Depois de obter a hora atual no MySQL, é muito comum alterar o formato de exibição.
    Para a intenção de busca “MySQL current time format”, a função mais importante a entender é DATE_FORMAT().

3.1 Formatação de datetime no MySQL: DATE_FORMAT(NOW(), …)

Sintaxe básica:

sql
SELECT DATE_FORMAT(target_datetime, 'format_string');

Exemplo: formatar a hora atual

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');

Exemplo de saída

2025-02-01 15:30:45

Especificadores de formato mais usados

EspecificadorSignificadoExemplo
%YAno (4 dígitos)2025
%mMês (2 dígitos)02
%dDia (2 dígitos)01
%HHora (formato 24h)15
%hHora (formato 12h)03
%iMinuto30
%sSegundo45
%pAM/PMPM

3.2 Conversão para formato estilo japonês ou 12 h

■ Formato estilo japonês

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');

Exemplo de saída:

2025-02-01 15:30

■ Formato 12 h + AM/PM

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');

Exemplo de saída:

2025-02-01 03:30:45 PM

3.3 Formatação apenas de hora no MySQL: TIME_FORMAT()

Função de formatação específica para dados do tipo TIME.

sql
SELECT TIME_FORMAT(CURTIME(), '%H:%i');

Exemplo de saída:

15:30

Observações
TIME_FORMAT() serve apenas para tipo TIME
– Para DATETIME, use DATE_FORMAT()

3.4 Conversão de string → datetime: STR_TO_DATE()

Para converter dados de string em um tipo datetime:

sql
SELECT STR_TO_DATE('2025-02-01 15:30:45', '%Y-%m-%d %H:%i:%s');

Exemplo de saída:

2025-02-01 15:30:45

Erros comuns
– Incompatibilidade de formato devolve NULL
– Confundir %m e %c (mês com zero à esquerda vs sem zero)

3.5 Pontos importantes em produção

❌ Não compare após formatar
Exemplo ruim:

sql
WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-01';

Isso não é recomendado porque os índices se tornam ineficazes (desempenho da consulta degrada).

Recomendado:

sql
WHERE created_at >= '2025-02-01' AND created_at < '2025-02-02';

❌ Não sobre‑formate no lado do banco de dados
Em aplicações web, a formatação para exibição costuma ser mais flexível no lado da aplicação.
O banco de dados deve focar em “armazenamento e cálculo”.

3.6 Formatação com milissegundos

sql
SELECT DATE_FORMAT(NOW(3), '%Y-%m-%d %H:%i:%s.%f');

%f representa microssegundos (6 dígitos).

Nota
Se a coluna não for DATETIME(3) ou similar, a parte fracionária será truncada.
Disponível no MySQL 5.6 e posteriores.

3.7 Resumo por finalidade de formatação

FinalidadeFunção
Alterar formato de exibiçãoDATE_FORMAT
Formatar apenas horaTIME_FORMAT
String → datetime conversionSTR_TO_DATE
Exibir milissegundos%f

4. MySQL Adição/Subtração de Data e Hora (DATE_ADD / DATE_SUB)

Mesmo que você consiga obter a hora atual, não pode usá‑la efetivamente em produção sem cálculos de data/hora como “X dias depois” ou “X horas atrás.”
Aqui explicamos como usar DATE_ADD() e DATE_SUB() com a hora atual no MySQL.

4.1 Adição de datetime no MySQL: DATE_ADD()

Sintaxe básica:

sql
SELECT DATE_ADD(base_datetime, INTERVAL value unit);

Exemplo: 7 dias a partir de agora

sql
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);

Exemplo: 2 horas depois

sql
SELECT DATE_ADD(NOW(), INTERVAL 2 HOUR);

Unidades mais usadas

UnidadeSignificado
SECONDSegundos
MINUTEMinutos
HOURHoras
DAYDias
MONTHMeses
YEARAnos

4.2 Subtração de datetime no MySQL: DATE_SUB()

Sintaxe básica:

sql
SELECT DATE_SUB(base_datetime, INTERVAL value unit);

Exemplo: 30 dias atrás

sql
SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);

Exemplo: 1 hora atrás

sql
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);

Casos de uso
– Verificações de expiração
– Exclusão de logs antigos
– Extração de dados recentes

4.3 Padrões comuns em produção

■ Recuperar dados das últimas 24 horas

sql
SELECT * FROM logs WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);

■ Definir um prazo 7 dias depois

sql
INSERT INTO tasks (deadline) VALUES (DATE_ADD(NOW(), INTERVAL 7 DAY));

4.4 Erros comuns e precauções
❌ Aplicar funções às colunas
Exemplo ruim:
WHERE DATE(created_at) = CURDATE();
Isso desabilita índices (otimização de desempenho da consulta).
Recomendado:
WHERE created_at >= CURDATE() AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
❌ Ignorar fusos horários
NOW() é baseado no fuso horário do servidor
Se você armazenar em UTC, use UTC_TIMESTAMP() como base
Exemplo:
SELECT DATE_ADD(UTC_TIMESTAMP(), INTERVAL 1 DAY);
❌ Armadilhas ao adicionar meses
SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH);
→ Devido ao ajuste de fim de mês, a data pode mudar.
(O resultado pode ser 2025-02-28 dependendo do ambiente.)
Entenda a especificação antes de usar cálculos baseados em meses.
4.5 Adição com milissegundos
SELECT DATE_ADD(NOW(3), INTERVAL 500 MILLISECOND);
※ O MySQL não suporta MILLISECOND diretamente.
Especifique em microssegundos:
SELECT DATE_ADD(NOW(3), INTERVAL 500000 MICROSECOND);
4.6 Melhores práticas
Padronize NOW() ou UTC_TIMESTAMP() como sua base
Não aplique funções às colunas na cláusula WHERE
Entenda o comportamento da adição baseada em meses
Se precisar de precisão, use DATETIME(3) ou superior

5. Calculando Diferenças de Data/Hora no MySQL (DATEDIFF / TIMESTAMPDIFF)

Em sistemas de produção, simplesmente obter a hora atual não é suficiente. Frequentemente é necessário calcular quantos dias se passaram ou quantas horas restam.

5.1 Calculando diferenças de data: DATEDIFF()

DATEDIFF() calcula a diferença em dias entre duas datas.

SELECT DATEDIFF('2025-02-10', '2025-02-01');

Resultado

9

Pontos chave

  • Retorna diferença apenas em dias
  • A parte de tempo é ignorada
  • O resultado pode ser negativo

Exemplo: calcular dias desde a criação

SELECT DATEDIFF(NOW(), created_at)
FROM users;

5.2 Calculando diferenças por unidade: TIMESTAMPDIFF()

TIMESTAMPDIFF() permite especificar a unidade.

SELECT TIMESTAMPDIFF(unit, start_datetime, end_datetime);

Exemplo: diferença em horas

SELECT TIMESTAMPDIFF(HOUR, '2025-02-01 10:00:00', '2025-02-01 15:00:00');

Resultado

5

Unidades comuns

UnitMeaning
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
MONTHMonths
YEARYears

Exemplo: calcular minutos desde o login

SELECT TIMESTAMPDIFF(MINUTE, login_at, NOW())
FROM users;

5.3 Casos de uso em produção

  • Verificações de timeout de sessão
  • Verificações de expiração de assinatura
  • Cálculo de tempo decorrido em logs
  • Lógica de limitação de taxa

5.4 Erros comuns

❌ Usar DATEDIFF quando a precisão de tempo é necessária

DATEDIFF() ignora horas e minutos.

❌ Inverter a ordem dos argumentos

A ordem é:

TIMESTAMPDIFF(unit, start, end)

Se invertido, o resultado se torna negativo.

❌ Ignorar fusos horários

Se misturar UTC e hora local, as diferenças podem estar incorretas.

5.5 Melhores práticas

  • Use TIMESTAMPDIFF() quando a precisão de tempo importa
  • Use DATEDIFF() para cálculos simples de dias
  • Garanta uso consistente de fusos horários
  • Padronize UTC em sistemas distribuídos

6. Consultas de Intervalo de Datas Usando a Hora Atual

Um dos requisitos reais mais comuns é recuperar registros dentro de um intervalo de tempo específico, como:

  • Registros de hoje
  • Últimos 7 dias
  • Últimas 24 horas
  • Este mês

6.1 Recuperando registros de hoje (amigável ao índice)

SELECT *
FROM logs
WHERE created_at >= CURDATE()
  AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

Por que isso está correto

  • Nenhuma função é aplicada à coluna
  • Os índices permanecem utilizáveis
  • Consulta de intervalo eficiente

6.2 Últimos 7 dias

SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

6.3 Últimas 24 horas

SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);

6.4 Este mês

SELECT *
FROM logs
WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')
  AND created_at < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH);

Em sistemas de produção, costuma ser melhor calcular os limites no lado da aplicação e passá‑los como parâmetros.

6.5 Erros comuns de desempenho

❌ Aplicar funções a colunas indexadas

WHERE DATE(created_at) = CURDATE();

Isso impede o uso de índices e causa varreduras completas da tabela.

❌ Usar BETWEEN descuidadamente

BETWEEN é inclusivo e pode causar problemas de diferença de um segundo.

6.6 Resumo das melhores práticas

  • Sempre use condições de intervalo para filtragem de datas
  • Evite aplicar funções a colunas indexadas
  • Prefira armazenamento em UTC em sistemas globais
  • Seja explícito sobre as suposições de fuso horário