- 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 y hora usando el tiempo actual en MySQL
- 5 5. Configuración de la zona horaria en MySQL
- 6 6. Cómo establecer la hora actual como valor predeterminado en MySQL
- 7 7. Errores comunes de MySQL y sus soluciones (FAQ)
- 8 8. Mejores prácticas para manejar la hora actual en MySQL
1. Introducción
¿Cuáles son los casos de uso para manejar la hora actual en MySQL?
En MySQL, obtener la hora actual es necesario en varias situaciones. Por ejemplo, se pueden considerar los siguientes casos de uso.
- Entrada automática de marca de tiempo al registrar datos
- Por ejemplo, al guardar datos de órdenes o registros, registrar la fecha y hora de creación de los datos.
- Filtrado de datos basado en la hora actual
- Por ejemplo, recuperar solo datos de los últimos 7 días o buscar datos con fechas futuras.
- Manipular y mostrar fechas y horas
- Al crear informes, formatear la fecha y hora para una mejor legibilidad.
- Gestionar la expiración de datos usando la hora actual
- Por ejemplo, determinar la expiración de un cupón comparándola con la hora actual.
Así, obtener y manipular correctamente la hora actual en MySQL es una habilidad esencial para las operaciones de bases de datos.
Lo que aprenderás en este artículo
En este artículo, explicaremos los siguientes temas en detalle.
- Cómo recuperar la hora actual en MySQL (
NOW(),CURRENT_TIMESTAMP, etc.) - Cambiar formatos de fecha y hora (cómo usar
DATE_FORMAT()) - Cálculos de fechas y horas usando la hora actual (manipulación de fechas con
INTERVAL) - Cómo cambiar la zona horaria (
SET SESSION time_zone) - Usar la hora actual como valor por defecto (aprovechando
CURRENT_TIMESTAMP) - Causas comunes de errores y soluciones (FAQ)
Cubriremos todo, desde lo básico hasta el uso avanzado de manejar la «hora actual» con MySQL, incluyendo ejemplos prácticos de SQL, así que por favor lee hasta el final.
2. Cómo obtener la hora actual en MySQL
Lista de funciones para obtener la hora actual en MySQL
MySQL ofrece varias funciones para obtener la hora actual. Comprende sus diferencias y úsalas de manera adecuada.
Función | Valor devuelto | Ejemplo |
|---|---|---|
NOW() | Fecha y hora actuales (fecha + hora) | SELECT NOW();2025-02-11 16:00:00 |
CURRENT_TIMESTAMP | Igual a | SELECT CURRENT_TIMESTAMP; |
CURDATE() | Solo la fecha actual | SELECT CURDATE();2025-02-11 |
CURTIME() | Solo hora actual | SELECT CURTIME();16:00:00 |
Usando la función NOW()
NOW() es la función más común en MySQL para obtener la hora actual. Devuelve tanto la fecha como la hora.
SELECT NOW();
Salida de ejemplo:
2025-02-11 16:00:00
NOW()devuelve la hora del sistema actual.- Debido a que está afectada por la zona horaria, la hora mostrada puede diferir de las expectativas …
Cómo usar CURRENT_TIMESTAMP
CURRENT_TIMESTAMP funciona casi igual que NOW(). Se ajusta al estándar SQL y se puede usar de manera similar en otras bases de datos.
SELECT CURRENT_TIMESTAMP;
Salida de ejemplo:
2025-02-11 16:00:00
Obtener solo la fecha con CURDATE()
CURDATE() se usa cuando quieres obtener solo la fecha actual (año-mes-día).
SELECT CURDATE();
Salida de ejemplo:
2025-02-11
Obtener solo la hora con CURTIME()
Usa CURTIME() cuando quieres obtener solo la hora actual (horas, minutos, segundos).
SELECT CURTIME();
Salida de ejemplo:
16:00:00
¿Cuál función debes usar?
Propósito | Función recomendada |
|---|---|
Desea recuperar la fecha y la hora | NOW()CURRENT_TIMESTAMP |
¿Quieres recuperar solo la fecha? | CURDATE() |
¿Quieres recuperar solo la hora? | CURTIME() |
3. Cómo formatear la hora actual en MySQL
Formato 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_to_format, 'format_specifier');
Ejemplo: NOW() a 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
Especificador | Significado | Ejemplo ( |
|---|---|---|
%Y | año de 4 dígitos | 2025 |
%m | Mes de dos dígitos (01-12) | 02 |
%d | día de 2 dígitos (01-31) | 11 |
%H | Hora en formato de 24 horas (00-23) | 16 |
%i | Minutes (00-59) | 45 |
%s | Segundos (00-59) | 30 |
Obtener solo la parte de hora con TIME()
Si deseas extraer solo la parte de hora del datetime obtenido con NOW(), usa la función TIME().
SELECT TIME(NOW());
Salida:
16:45:30
Extracción parcial con YEAR(), MONTH(), DAY()
Para extraer partes específicas, usa las siguientes funciones.
Función | Valor devuelto | SQL | Ejemplo de salida ( |
|---|---|---|---|
YEAR() | Año | SELECT YEAR(NOW()); | 2025 |
MONTH() | Mes | SELECT MONTH(NOW()); | 2 |
DAY() | Día | SELECT DAY(NOW()); | 11 |
Ejemplos prácticos de cambios de formato
El siguiente SQL es útil para probar varios formatos.
SELECT
NOW() AS 'Original datetime',
DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
DATE_FORMAT(NOW(), '%H:%i:%s') AS 'Hour:Minute:Second',
TIME(NOW()) AS 'Time only',
YEAR(NOW()) AS 'Year',
MONTH(NOW()) AS 'Month',
DAY(NOW()) AS 'Day';

4. Cálculos de fecha y hora usando el tiempo actual en MySQL
Usando INTERVAL para adición y sustracción
Sintaxis básica
SELECT current_time + INTERVAL numeric_value unit;
SELECT current_time - INTERVAL numeric_value unit;
Adición basada 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
Unidad | Significado | Ejemplo |
|---|---|---|
SECOND | segundos | NOW() + INTERVAL 10 SECOND |
MINUTE | minutes | NOW() + INTERVAL 5 MINUTE |
HORA> | horas | NOW() + INTERVAL 2 HOUR |
DÍA | días | NOW() + INTERVAL 10 DAY |
MES | meses | NOW() + INTERVAL 3 MONTH |
Usando DATEDIFF() para calcular la diferencia entre dos fechas
SELECT DATEDIFF(NOW(), '2025-01-01');
Ejemplo de salida:
30
Usando BETWEEN para filtrar un rango de fechas
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
5. Configuración de la 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
Añada lo siguiente al archivo de configuración (my.cnf):
[mysqld]
default_time_zone = 'Asia/Tokyo'
Obtener hora UTC usando UTC_TIMESTAMP
SELECT UTC_TIMESTAMP();
Convertir a hora local usando CONVERT_TZ()
SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');
6. Cómo establecer la hora actual como valor predeterminado en MySQL
SETEAR CURRENT_TIMESTAMP como valor predeterminado
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Actualización automática 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 el tipo DATETIME y el tipo TIMESTAMP
Tipo | Timezone impact | CURRENT_TIMESTAMP |
|---|---|---|
TIMESTAMP | Afectado | Possible |
DATETIME | No afectado | Not possible |
Por qué NOW() no puede usarse 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 sus soluciones (FAQ)
NOW() no puede usarse 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 está desfasada
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';
La especificación de rango BETWEEN no funciona correctamente
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
Caso de uso | Recomendado |
|---|---|
Obtener la hora actual en una declaración | NOW() |
Establecer automáticamente la hora actual en | CURRENT_TIMESTAMP |
Establecer como valor predeterminado para columnas | CURRENT_TIMESTAMP |
Cuándo usar TIMESTAMP vs DATETIME
Tipo de datos | Efecto de zona horaria | Tamaño de almacenamiento |
|---|---|---|
TIMESTAMP | Afectado | 4 bytes |
DATETIME | Inalterado | 8 bytes |
Diseño: 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 datos correctamente
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;%


