Guía completa: Obtener, formatear y usar la hora actual en MySQL

目次

1. Introducción

La importancia de manejar la hora actual en MySQL

MySQL otorga gran importancia al manejo del tiempo para gestionar adecuadamente la información almacenada en una base de datos. En particular, las funciones que recuperan y manipulan la hora actual se utilizan en muchos escenarios, como el registro de logs, la gestión de horarios y el registro de marcas de tiempo de actualizaciones de datos. Por ejemplo, puedes aprovechar la hora actual en casos como los siguientes.

  • Sistema de gestión de pedidos : registrar automáticamente las marcas de tiempo de los pedidos
  • Gestión de logs : registrar logs de errores del sistema y logs de acceso
  • Función de programación : almacenar citas futuras en la base de datos y enviar recordatorios

Así, manejar correctamente la hora actual en MySQL es crucial para mejorar la integridad de los datos y la precisión analítica.

Qué buscan los usuarios que quieren saber la “hora actual de MySQL”

Muchos usuarios que buscan “hora actual de MySQL” tienen los siguientes objetivos.

  1. Quieren recuperar la hora actual
  2. Quieren formatear la hora recuperada
  3. Quieren manipular la hora (sumar/restar)
  4. Quieren consultar datos dentro de un rango de tiempo específico
  5. Quieren manejar la hora con consideraciones de zona horaria

Para satisfacer estas necesidades, este artículo ofrece una explicación detallada, desde lo básico hasta temas avanzados, de cómo recuperar la hora actual en MySQL.

Qué aprenderás en este artículo

En este artículo, puedes aprender de manera sistemática los siguientes puntos.

  • Métodos básicos para recuperar la hora actual en MySQL
  • Cómo cambiar el formato de la hora actual
  • Cómo realizar cálculos de fecha/hora (suma/resta)
  • Cómo manejar la hora con consideraciones de zona horaria
  • Casos de uso práctico (gestión de logs, gestión de horarios, etc.)

Al aprovechar esta información, puedes gestionar los datos de MySQL de manera más eficiente.

2. Cómo obtener la hora actual en MySQL

Métodos principales para obtener la hora actual en MySQL

Hay varias formas de recuperar la hora actual en MySQL. Principalmente, se utiliza la función NOW(), pero dependiendo del caso de uso, también puedes usar CURRENT_TIMESTAMP, CURDATE() o CURTIME().

NOW() para recuperar la hora actual

Sintaxis básica de NOW()

SELECT NOW();

Resultado (Ejemplo)

2025-02-01 15:30:45

NOW() recupera la fecha y hora actuales en el formato YYYY-MM-DD HH:MM:SS.

Usando CURRENT_TIMESTAMP

CURRENT_TIMESTAMP también devuelve el resultado como NOW().

Sintaxis básica de CURRENT_TIMESTAMP

SELECT CURRENT_TIMESTAMP;

Resultado (Ejemplo)

2025-02-01 15:30:45

CURRENT_TIMESTAMP puede usarse como valor predeterminado de una columna.

Ejemplo de establecer CURRENT_TIMESTAMP como valor predeterminado

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

Obtener solo la fecha con CURDATE()

Sintaxis básica de CURDATE()

SELECT CURDATE();

Resultado (Ejemplo)

2025-02-01

Puedes obtener solo la fecha sin la hora.

Obtener solo la hora con CURTIME()

Sintaxis básica de CURTIME()

SELECT CURTIME();

Resultado (Ejemplo)

15:30:45

CURTIME() se usa cuando necesitas recuperar solo la hora.

Tabla comparativa de funciones

Función

Datos Recuperados

Uso típico

NOW()

Fecha y hora actuales (YYYY-MM-DD HH:MM:SS)

Registro de marcas de tiempo de creación/actualización de datos

CURRENT_TIMESTAMP

Igual a NOW() (puede aplicarse como valor predeterminado de columna)

Valor predeterminado al crear una tabla

CURDATE()

Solo la fecha actual (YYYY-MM-DD)

Obtener la fecha de hoy / filtrado

CURTIME()

Solo hora actual (HH:MM:SS)

Extrayendo datos para rangos de tiempo específicos

Resumen

  • Si necesitas la fecha y hora actuales, usa NOW()
  • Para valores predeterminados de columnas, usa CURRENT_TIMESTAMP
  • Si solo quieres la fecha, usa CURDATE()
  • Si solo quieres la hora, usa CURTIME()

3. Cómo formatear la hora actual en MySQL

Usando DATE_FORMAT() para formatear la hora actual

Sintaxis básica de DATE_FORMAT()

SELECT DATE_FORMAT(NOW(), 'format_string');

Al especificar un format_string, puedes cambiar el formato de visualización de la fecha y hora.

Ejemplos básicos de formato

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
Resultado (ejemplo)
2025-02-01 15:30:45

Lista de opciones de formato para DATE_FORMAT()

Symbol

Descripción

Ejemplo (2025-02-01 15:30:45)

%Y

Año (4 dígitos)

2025
%m

Mes (relleno con ceros)

02
%d

Día (relleno con ceros)

01
%H

Hora (24 horas)

15
%h

Hora (12 horas)

03
%i

Minuto (relleno con ceros)

30
%s

Segundo (relleno con ceros)

45
%p

AM/PM

PM

Ejemplos concretos usando DATE_FORMAT()

Formato japonés

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
Resultado
2025-02-01 15:30

Formato de 12 horas (con AM/PM)

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');
Resultado
2025-02-01 03:30:45 PM

Formato de hora usando TIME_FORMAT()

TIME_FORMAT() es una función de formato especializada para datos de hora (TIME type).

Sintaxis básica de TIME_FORMAT()

SELECT TIME_FORMAT(NOW(), '%H:%i:%s');
Resultado
15:30:45

Convertir una cadena a una fecha usando STR_TO_DATE()

Use STR_TO_DATE() al convertir una fecha/hora en cadena al tipo DATETIME de MySQL.

Sintaxis básica de STR_TO_DATE()

SELECT STR_TO_DATE('2025-2-1 15:30', '%Y-%c-%e %H:%i');
Resultado
2025-02-01 15:30:00

Resumen

  • Use DATE_FORMAT() para cambiar el formato de fecha/hora
  • TIME_FORMAT() también se puede usar para formato solo de hora
  • Puede combinar opciones de formato para cambiar libremente el formato de visualización
  • Usando STR_TO_DATE(), también puede convertir cadenas a tipos de fecha

4. Cálculos de fecha y hora usando la marca de tiempo actual de MySQL

Usando DATE_ADD() para obtener fechas futuras

Sintaxis básica de DATE_ADD()

SELECT DATE_ADD(NOW(), INTERVAL numeric_value time_unit);

Unidad de Tiempo

Significado

Ejemplo

SECOND

Second

DATE_ADD(NOW(), INTERVAL 30 SECOND)

MINUTE

Minute

DATE_ADD(NOW(), INTERVAL 10 MINUTE)

HORA

Hora

DATE_ADD(NOW(), INTERVAL 2 HOUR)

DÍA

Día

DATE_ADD(NOW(), INTERVAL 7 DAY)

MES

Mes

DATE_ADD(NOW(), INTERVAL 3 MONTH)

Obtener la fecha y hora 7 días después

SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
Salida de ejemplo
2025-02-08 14:00:00

Usando DATE_SUB() para obtener fechas pasadas

Sintaxis básica de DATE_SUB()

SELECT DATE_SUB(NOW(), INTERVAL numeric_value time_unit);

Obtener la fecha 30 días atrás

SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);
Salida de ejemplo
2025-01-02 14:00:00

Usando TIMESTAMPDIFF() para encontrar la diferencia entre dos fechas y horas

Sintaxis básica de TIMESTAMPDIFF()

SELECT TIMESTAMPDIFF(unit, datetime1, datetime2);

Unidad

Valores Obtenidos

SECOND

Diferencia en segundos

MINUTE

Diferencia en minutos

HORA

Diferencia en horas

DÍA

Diferencia en días

MES

Diferencia en meses

Calcular la diferencia entre dos fechas en días

SELECT TIMESTAMPDIFF(DAY, '2025-01-01', NOW());
Salida de ejemplo
31

Usando DATEDIFF() para calcular la diferencia de días

SELECT DATEDIFF('2025-02-10', '2025-02-01');
Salida de ejemplo
9

Usando TIME_TO_SEC() para convertir hora a segundos

SELECT TIME_TO_SEC('01:30:00');
Salida
5400

Usando SEC_TO_TIME() para convertir segundos a hora

SELECT SEC_TO_TIME(5400);
Salida
01:30:00

Resumen

Función

Propósito

Ejemplo

DATE_ADD()

Recuperar fecha y hora futuras

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

Recuperar fecha y hora pasadas

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

Obtener la diferencia entre dos fechas

SELECT TIMESTAMPDIFF(DAY, '2025-01-01', NOW());
DATEDIFF()

Obtener la diferencia entre dos fechas en días

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

Convertir tiempo a segundos

SELECT TIME_TO_SEC('01:30:00');
SEC_TO_TIME()

Convertir segundos a tiempo

SELECT SEC_TO_TIME(5400);

5. Configuración de zona horaria y su impacto en la hora actual

Verificando la zona horaria actual de MySQL

Verificando la zona horaria predeterminada a nivel de sistema

SHOW VARIABLES LIKE '%time_zone%';
Salida de ejemplo
+-----------------+--------+
| Variable_name   | Value  |
+-----------------+--------+
| system_time_zone | UTC    |
| time_zone       | +00:00 |
+-----------------+--------+

Cambiando la zona horaria de MySQL

Cambiando la zona horaria por sesión

SET SESSION time_zone = 'Asia/Tokyo';

Cambiando la zona horaria a nivel de servidor (configurada en my.cnf)

[mysqld]
default-time-zone = '+09:00'

Reiniciar MySQL después de cambiar la configuración

sudo systemctl restart mysql

Cómo recuperar la hora UTC

SELECT UTC_TIMESTAMP();
Salida de ejemplo
2025-02-01 14:30:45

Convertir a una zona horaria diferente con CONVERT_TZ()

SELECT CONVERT_TZ(NOW(), 'Asia/Tokyo', 'UTC');
Salida
2025-02-01 14:30:45

Configurar zonas horarias diferentes por usuario

Convertir a la zona horaria del usuario

SELECT CONVERT_TZ(NOW(), 'UTC', 'America/New_York');
Salida de ejemplo
2025-02-01 09:30:45

La diferencia entre los tipos TIMESTAMP y DATETIME

Tipo de datos

Efecto de zona horaria

Ejemplo

TIMESTAMPAfectado (convertido a UTC)

Almacenado después de la conversión a UTC

DATETIMEInalterado (valor fijo)

Queda como YYYY-MM-DD HH:MM:SS

Ejemplo de almacenamiento de datos para TIMESTAMP y DATETIME

CREATE TABLE time_test (
    ts_column TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    dt_column DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO time_test () VALUES ();
SELECT * FROM time_test;
Salida de ejemplo
+---------------------+---------------------+
| ts_column          | dt_column           |
+---------------------+---------------------+
| 2025-02-01 14:30:45 | 2025-02-01 23:30:45 |
+---------------------+---------------------+

Resumen

  • Verificar la zona horaria actualSHOW VARIABLES LIKE '%time_zone%';
  • Cambiar por sesiónSET SESSION time_zone = 'Asia/Tokyo';
  • Cambiar el valor por defecto a nivel de servidor → Configurar default-time-zone = '+09:00' en my.cnf
  • Obtener la hora UTCSELECT UTC_TIMESTAMP();
  • Conversión de zona horariaSELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
  • TIMESTAMP se ve afectado por las zonas horarias, mientras que DATETIME es fijo

6. Casos de Uso Prácticos (Cómo usar la hora actual de MySQL en situaciones reales)

Gestión de Registros (Grabación de marcas de tiempo de creación y actualización de datos)

Crear Tabla (Incluyendo marcas de tiempo de creación y actualización)

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Insertar Datos

INSERT INTO logs (event) VALUES ('User logged in');

Actualizar Datos

UPDATE logs SET event = 'User changed password' WHERE id = 1;

Gestión de Programaciones (Cálculo automático de fechas futuras)

Programar un Evento una Semana Más Tarde

INSERT INTO schedule (event_name, event_date) 
VALUES ('Project deadline', DATE_ADD(NOW(), INTERVAL 7 DAY));

Extraer Datos para un Período Específico

Obtener los Datos de Este Mes

SELECT * FROM orders 
WHERE order_date BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE());

Registro de Historial de Acceso

Tabla para Registrar Registros de Acceso

CREATE TABLE access_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    access_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Registrar Acceso de Usuario

INSERT INTO access_logs (user_id) VALUES (123);

Gestión de Expiración de Datos

Eliminar Datos Antiguos a Más de 30 Días

DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

Resumen

Caso de uso

Función utilizada

Ejemplo

Gestión de registrosCURRENT_TIMESTAMPcreated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Gestión de horariosDATE_ADD()INSERT INTO schedule VALUES (DATE_ADD(NOW(), INTERVAL 7 DAY));
Recuperación de datos de período específicoBETWEENCURDATE()SELECT * FROM orders WHERE order_date BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE());
Registro de historial de accesoTIMESTAMPINSERT INTO access_logs (user_id) VALUES (123);
Eliminación de datos antiguosDATE_SUB()DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

7. Errores Comunes y Solución de Problemas

NOW() no se puede recuperar en la zona horaria correcta

Causa

  • La zona horaria por defecto de MySQL está configurada a UTC
  • Los ajustes de zona horaria específicos de la sesión son incorrectos

Solución

Verificar la zona horaria actual
SHOW VARIABLES LIKE '%time_zone%';
Cambiar temporalmente la zona horaria
SET SESSION time_zone = 'Asia/Tokyo';
Cambiar la zona horaria por defecto a nivel de servidor
[mysqld]
default-time-zone = '+09:00'

Reiniciar MySQL para que los cambios surtan efecto.

CURRENT_TIMESTAMP devuelve una fecha/hora inesperada

Causa

  • Usar una columna TIMESTAMP (sujeta a efectos de zona horaria)
  • La zona horaria del servidor está configurada a UTC

Solución

Usar el tipo DATETIME evita efectos de zona horaria
CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
Si se usa el tipo TIMESTAMP, convertir con CONVERT_TZ()
SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo') FROM logs;

Los resultados de TIMESTAMPDIFF() difieren de las expectativas

Causa

  • TIMESTAMPDIFF() redondea los cálculos por unidad
  • Ejemplo: TIMESTAMPDIFF(DAY, '2025-02-01 23:59:59', '2025-02-02 00:00:01')0 days

Solución

  • Realizar cálculos más precisos en segundos
SELECT TIMESTAMPDIFF(SECOND, '2025-02-01 23:59:59', '2025-02-02 00:00:01');
Resultado
2

Elección entre TIMESTAMP y DATETIME

Tipo de datos

Efecto de zona horaria

Uso recomendado

TIMESTAMPAfectado (convertido a UTC)

Sistemas utilizados por usuarios de todo el mundo

DATETIMEInalterado (valor fijo)

Gestión estricta del tiempo local

Cuando se usa TIMESTAMP
CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Cuando se usa DATETIME
CREATE TABLE reservations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    reserved_at DATETIME NOT NULL
);

Resumen

Error

Causa

Solution

NOW()

La configuración de zona horaria del servidor difiere

SET SESSION time_zone = 'Asia/Tokyo';
CURRENT_TIMESTAMP

Efecto de TIMESTAMP tipo

Use DATETIME type

El resultado de TIMESTAMPDIFF() difiere de las expectativas

Impacto del error de redondeo

Use TIMESTAMPDIFF(SECOND, datetime1, datetime2)

No entiendo la diferencia entre TIMESTAMP y DATETIME

Si la zona horaria les afecta

TIMESTAMPDATETIME
%

Al manejar la hora actual de MySQL, entender la configuración y las características de los tipos de datos ayuda a prevenir errores inesperados.

8. Preguntas frecuentes (Preguntas y respuestas)

¿Cuál es la diferencia entre NOW() y CURRENT_TIMESTAMP?

Respuesta

En general, ambas tienen la misma funcionalidad, pero solo CURRENT_TIMESTAMP puede usarse al establecer el valor por defecto de una columna.

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

¿Cómo obtener la hora actual en UTC con MySQL?

Respuesta

Con la siguiente consulta, puedes obtener la hora UTC actual independientemente de la configuración de zona horaria de MySQL.

SELECT UTC_TIMESTAMP();

Además, si deseas convertir el resultado de NOW() a UTC, usa CONVERT_TZ().

SELECT CONVERT_TZ(NOW(), 'Asia/Tokyo', 'UTC');

¿Debería almacenarse la fecha y la hora en columnas separadas?

Respuesta

  • Deseas almacenar fecha y hora juntas (registros, gestión de reservas)
  CREATE TABLE reservations (
      id INT AUTO_INCREMENT PRIMARY KEY,
      reserved_at DATETIME NOT NULL
  );
  • Deseas gestionar fecha y hora por separado (horarios, etc.)
  CREATE TABLE work_schedules (
      id INT AUTO_INCREMENT PRIMARY KEY,
      work_date DATE NOT NULL,
      work_time TIME NOT NULL
  );

¿Por qué cambia la zona horaria de NOW()?

Respuesta

Primero, verifiquemos la configuración actual.

SHOW VARIABLES LIKE '%time_zone%';

Para cambiar la configuración:

SET SESSION time_zone = 'Asia/Tokyo';

¿Se puede establecer la precisión de NOW() en milisegundos?

Respuesta

A partir de MySQL 5.6, puedes obtener segundos fraccionarios (milisegundos).

SELECT NOW(3);
Salida de ejemplo (ejemplo)
2025-02-01 14:30:45.123

Al almacenar datos con precisión de milisegundos

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3)
);

Resumen

  • NOW() y CURRENT_TIMESTAMP son básicamente iguales, pero usa CURRENT_TIMESTAMP para valores por defecto de columnas
  • Usa UTC_TIMESTAMP() para obtener la hora UTC
  • DATETIME es un valor fijo, TIMESTAMP se convierte según la zona horaria
  • Usa NOW(3) para obtener milisegundos
  • Si la zona horaria cambia, ejecuta SET SESSION time_zone = 'Asia/Tokyo';

9. Resumen

Cómo obtener la hora actual en MySQL

NOW()Obtener la fecha y hora actuales (YYYY-MM-DD HH:MM:SS)
CURRENT_TIMESTAMPPuede usarse como valor por defecto de una columna
CURDATE()Obtener solo la fecha de hoy
CURTIME()Obtener solo la hora actual
UTC_TIMESTAMP()Siempre obtener la hora UTC

Cómo formatear la hora actual en MySQL

✅ Usando DATE_FORMAT(), puedes convertir fechas y horas a un formato legible.

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

Cálculos de fechas usando la hora actual en MySQL

Obtener una fecha futura

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

Obtener una fecha pasada

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

Calcular la diferencia entre dos fechas

SELECT TIMESTAMPDIFF(DAY, '2025-01-01', NOW());

Convertir una hora a segundos

SELECT TIME_TO_SEC('01:30:00');

Gestión de zona horaria

Verificar la zona horaria actual

SHOW VARIABLES LIKE '%time_zone%';

Cambiar la zona horaria a Hora Estándar de Japón (JST)

SET SESSION time_zone = 'Asia/Tokyo';

Cómo obtener la hora UTC

SELECT UTC_TIMESTAMP();

Convertir hora con conocimiento de zona horaria

SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');

Casos de uso práctico

Gestión de registros (grabación automática de marcas de tiempo de creación y actualización)

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Gestión de horarios (cálculo de fechas futuras)

INSERT INTO schedule (event_name, event_date) 
VALUES ('Project deadline', DATE_ADD(NOW(), INTERVAL 7 DAY));

Eliminar datos antiguos (eliminar registros con más de 30 días)

DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

Puntos clave

📌 Guía completa para obtener la hora actual en MySQL
📌 Explicación de cómo usar el formato y los cálculos de fechas
📌 Demostración de ejemplos prácticos útiles en escenarios del mundo real (gestión de registros, gestión de horarios, etc.)
📌 Discusión detallada de errores comunes y sus soluciones

La gestión del tiempo en MySQL es útil para una variedad de propósitos, como registro, manejo de expiración de datos y gestión de horarios. Domina las funciones adecuadas y podrás implementar el manejo del tiempo que cumpla con los requisitos de tu sistema.