- 1 1. Introducción
- 2 2. Cómo obtener la hora actual en MySQL
- 3 3. Cómo formatear la hora actual en MySQL
- 4 4. Cálculos de Fecha/Hora Usando la Hora Actual en MySQL
- 5 5. Configuraciones de Zona Horaria en MySQL
- 6 6. Cómo Establecer la Hora Actual como Valor Predeterminado en MySQL
- 7 7. Errores Comunes de MySQL y Soluciones (FAQ)
- 8 8. Mejores Prácticas para Manejar la Hora Actual en MySQL
1. Introducción
¿Cuándo necesitas manejar la hora actual en MySQL?
En MySQL, obtener la hora actual es necesario en muchos escenarios diferentes. Por ejemplo, los siguientes casos de uso son comunes:
- Insertar automáticamente una marca de tiempo al registrar datos
- Por ejemplo, registrar la fecha y hora de creación al guardar datos de pedidos o de registros.
- Filtrar datos en función de la hora actual
- Por ejemplo, obtener solo los datos de los últimos 7 días o buscar registros con fechas futuras.
- Formatear fechas y horas para su visualización
- Formatear valores de fecha y hora para una mejor legibilidad al generar informes.
- Gestionar la expiración de datos usando la hora actual
- Por ejemplo, determinar si un cupón sigue siendo válido comparándolo con la hora actual.
Como puedes ver, obtener y manipular correctamente la hora actual en MySQL es una habilidad importante en la gestión de bases de datos.
Qué aprenderás en este artículo
Este artículo explica los siguientes temas en detalle:
- Cómo obtener la hora actual en MySQL (
NOW(),CURRENT_TIMESTAMP, etc.) - Cómo cambiar formatos de fecha y hora (usando
DATE_FORMAT()) - Cálculos de fecha y hora usando la hora actual (usando
INTERVAL) - Cómo cambiar la zona horaria (
SET SESSION time_zone) - Usar la hora actual como valor por defecto (
CURRENT_TIMESTAMP) - Errores comunes y cómo solucionarlos (FAQ)
Desde lo básico hasta el uso avanzado del manejo de la “hora actual” en MySQL, esta guía ofrece ejemplos prácticos de SQL. Asegúrate de leer hasta el final.
2. Cómo obtener la hora actual en MySQL
Lista de funciones para obtener la hora actual en MySQL
MySQL proporciona varias funciones para obtener la hora actual. Comprende sus diferencias y utilízalas de forma adecuada.
| 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 |
Función NOW()
NOW() es la función más utilizada en MySQL para obtener la hora actual.
Devuelve tanto la fecha como la hora.
SELECT NOW();
Ejemplo de salida:
2025-02-11 16:00:00
NOW()devuelve la hora del sistema actual.- Como está influenciada por la zona horaria, la hora mostrada puede variar según tu entorno (explicado en detalle en la sección “Configuración de zona horaria”).
Cómo usar CURRENT_TIMESTAMP
CURRENT_TIMESTAMP se comporta casi igual que NOW(). Cumple con el estándar SQL y también puede usarse en otras bases de datos.
SELECT CURRENT_TIMESTAMP;
Ejemplo de salida:
2025-02-11 16:00:00
Obtener solo la fecha con CURDATE()
CURDATE() se usa cuando deseas obtener solo la fecha actual (año, mes, día).
SELECT CURDATE();
Ejemplo de salida:
2025-02-11
Obtener solo la hora con CURTIME()
Si deseas obtener solo la hora actual (hora, minuto, segundo), usa CURTIME().
SELECT CURTIME();
Ejemplo de salida:
16:00:00
¿Qué función deberías usar?
| Purpose | Recommended Function |
|---|---|
| Retrieve both date and time | NOW() or CURRENT_TIMESTAMP |
| Retrieve date only | CURDATE() |
| Retrieve time only | CURTIME() |
3. Cómo formatear la hora actual en MySQL
Formateo personalizado con DATE_FORMAT()
Sintaxis básica de DATE_FORMAT()
En MySQL, puedes usar la función DATE_FORMAT() para cambiar libremente el formato de fechas y horas.
SELECT DATE_FORMAT(datetime_value, 'format_specifiers');
Ejemplo: Convertir NOW() al formato YYYY/MM/DD HH:MM
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');
Salida:
2025/02/11 16:45
Lista de especificadores de formato comunes
| 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 |
Extraer solo la parte de la hora con TIME()
Si deseas extraer solo la porción de hora del datetime devuelto por NOW(), usa la función TIME().
SELECT TIME(NOW());
Salida:
16:45:30
Extraer partes con YEAR(), MONTH() y DAY()
Para extraer solo partes específicas, usa las siguientes funciones.
| 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 |
Ejemplos prácticos de formateo
El siguiente SQL es útil para probar varios formatos en la práctica.
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 Fecha/Hora Usando la Hora Actual en MySQL
Añadir/Restar con INTERVAL
Sintaxis Básica
SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;
Añadir Tiempo Basado en NOW()
Por ejemplo, para obtener la fecha y hora “una semana después”:
SELECT NOW() + INTERVAL 7 DAY;
Ejemplo de salida:
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 la Diferencia Entre Dos Fechas con DATEDIFF()
SELECT DATEDIFF(NOW(), '2025-01-01');
Ejemplo de salida:
30
Filtrar por un Rango de Fechas con BETWEEN
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
5. Configuraciones de Zona Horaria en MySQL
Verificar la Zona Horaria Actual
SHOW VARIABLES LIKE '%time_zone%';
Ejemplo de salida:
+------------------+----------------+
| Variable_name | Value |
+------------------+----------------+
| system_time_zone | UTC |
| time_zone | SYSTEM |
+------------------+----------------+
Cambiar la Zona Horaria por Sesión
SET SESSION time_zone = 'Asia/Tokyo';
Cambiar la Zona Horaria Predeterminada del Servidor
Agregue lo siguiente al archivo de configuración (my.cnf):
[mysqld]
default_time_zone = 'Asia/Tokyo'
Obtener la Hora UTC con UTC_TIMESTAMP
SELECT UTC_TIMESTAMP();
Convertir a Hora Local con CONVERT_TZ()
SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');
6. Cómo Establecer la Hora Actual como Valor Predeterminado en MySQL
Establecer CURRENT_TIMESTAMP como Valor Predeterminado
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Actualizaciones Automáticas con 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
);
Diferencia Entre DATETIME y TIMESTAMP
| Type | Affected by Time Zone | Can Set CURRENT_TIMESTAMP as Default |
|---|---|---|
TIMESTAMP | Yes | Yes |
DATETIME | No | No |
Por Qué No Puedes Usar NOW() como Valor Predeterminado y la Solución
ERROR 1067 (42000): Invalid default value for 'created_at'
Solución:
CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
7. Errores Comunes de MySQL y Soluciones (FAQ)
No Se Puede Usar NOW() como Valor Predeterminado
Ejemplo de Error
CREATE TABLE logs (
created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'
Solución
CREATE TABLE logs (
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
La Hora de CURRENT_TIMESTAMP es Incorrecta
SHOW VARIABLES LIKE 'time_zone';
Solución
SET SESSION time_zone = 'Asia/Tokyo';
El Resultado de NOW() Está Desfasado una Hora
SHOW VARIABLES LIKE 'system_time_zone';
Solución
SET GLOBAL time_zone = 'Asia/Tokyo';
El Filtrado por Rango con BETWEEN No Funciona como se Espera
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';
Solución
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
8. Mejores Prácticas para Manejar la Hora Actual en MySQL
Cuándo 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 |
Cuándo Usar TIMESTAMP vs DATETIME
| Data Type | Affected by Time Zone | Storage Size |
|---|---|---|
TIMESTAMP | Yes | 4 bytes |
DATETIME | No | 8 bytes |
Almacenar en UTC y Convertir a Hora Local
SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');
Usar >= y < en lugar de BETWEEN
SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00'
AND created_at < '2025-03-01 00:00:00';
Estandarizar el uso de INTERVAL
SELECT NOW() + INTERVAL 1 DAY;
Limpiar adecuadamente los datos antiguos
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;


