- 1 1. Introducción
- 2 2. Cómo Obtener la Hora Actual en MySQL
- 3 3. Formateo y visualización de la hora actual
- 4 4. Cálculos de fecha y hora usando la hora actual
- 4.1 INTERVAL para adición y sustracción de fechas y horas
- 4.1.1 (1) Obtener la hora 1 hora después de la hora actual
- 4.1.2 Salida
- 4.1.3 (2) Obtener la fecha 7 días después de la fecha actual
- 4.1.4 Salida
- 4.1.5 (3) Obtener la fecha 3 días antes de la fecha actual
- 4.1.6 Salida
- 4.1.7 (4) Obtener la fecha 1 mes después de una fecha y hora específica
- 4.1.8 Salida
- 4.1.9 (5) Obtener la fecha 1 año después de una fecha y hora específica
- 4.1.10 Salida
- 4.2 Cálculo de diferencia de fechas usando DATEDIFF()
- 4.3 Cálculo de diferencia de unidades de tiempo usando TIMESTAMPDIFF()
- 4.4 Filtrado de rango de fechas usando BETWEEN
- 4.5 Resumen
- 4.1 INTERVAL para adición y sustracción de fechas y horas
- 5 5. Configuración y gestión de zonas horarias
- 6 6. Cómo establecer la marca de tiempo actual como valor predeterminado
- 7 7. Ejemplos prácticos usando la hora actual de MySQL
- 7.1 Añadiendo la hora actual a los registros de log
- 7.2 Obtención de datos de las últimas 24 horas
- 7.3 Actualización de la última hora de inicio de sesión del usuario
- 7.4 Registro automático de fechas y horas de creación y actualización de datos
- 7.5 SQL para obtener datos dentro de un período determinado
- 7.6 Resumen
- 8 8. Preguntas Frecuentes (FAQ)
- 8.1 NOW() y CURRENT_TIMESTAMP: ¿Cuál es la diferencia?
- 8.2 Quiero obtener la hora actual con NOW(), pero no funciona correctamente
- 8.3 Causas de deriva de tiempo en CURRENT_TIMESTAMP y soluciones
- 8.4 Razones por las que NOW() no puede establecerse como valor predeterminado
- 8.5 Cómo manejar casos donde la especificación de rango usando BETWEEN no funciona
- 8.6 Casos en los que debes usar SYSDATE() y casos en los que no
- 8.7 Resumen
- 9 9. Resumen
- 9.1 Resumen de Métodos para Obtener la Hora Actual en MySQL
- 9.2 Formateo y Manipulación de la Hora Actual
- 9.3 Cálculos con la Hora Actual
- 9.4 Gestión de la Zona Horaria
- 9.5 Establecer la Hora Actual como Valor Predeterminado
- 9.6 Ejemplos prácticos del tiempo actual en MySQL
- 9.7 Próximos pasos
- 9.8 Conclusión
1. Introducción
Razones para Obtener la Hora Actual en MySQL
Cuando se utiliza una base de datos, obtener la fecha y hora actuales es necesario en muchas situaciones. Por ejemplo, se pueden considerar los siguientes casos de uso.
- Registro de Fechas y Horas de Creación y Actualización de Datos Al mantener registros, se facilita la gestión del historial de cambios de los datos.
- Análisis de Datos en Tiempo Real Al manejar datos de series temporales, obtener la hora actual facilita el procesamiento de los datos.
- Obtención de Datos para un Período Específico Por ejemplo, consultas como «obtener datos actualizados en las últimas 24 horas» requieren la hora actual.
Propósito y Visión General de Este Artículo
En este artículo, explicaremos en detalle cómo obtener la hora actual en MySQL. Cubrimos una amplia gama, desde la introducción de funciones básicas hasta la modificación de formatos de fecha y hora, métodos de cálculo y gestión de zonas horarias. En particular, para facilitar la comprensión a los principiantes, explicaremos con ejemplos de código.
El Método Más Simple para Obtener la Hora Actual (Conclusión Primero)
La forma más sencilla de obtener la fecha y hora actuales en MySQL es usar la función NOW(). Ejecutar el siguiente SQL recuperará la fecha y hora actuales.
SELECT NOW();
Al ejecutar esta consulta se obtendrán resultados como los siguientes.
+---------------------+
| NOW() |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
De esta manera, puedes obtener la «fecha» y la «hora» actuales. Sin embargo, MySQL también dispone de otras funciones como SYSDATE() y CURRENT_TIMESTAMP, cada una con características distintas.
2. Cómo Obtener la Hora Actual en MySQL
MySQL ofrece varias funciones para obtener la fecha y hora actuales. Cada función tiene características distintas, por lo que debes seleccionar la adecuada según el caso de uso.
Funciones Disponibles para Obtener la Hora Actual en MySQL
Nombre de la función | Datos Obtenidos | Características |
|---|---|---|
NOW() | Fecha y Hora ( | Devuelve la fecha y hora en el momento de la ejecución de la consulta. |
SYSDATE() | Fecha y Hora ( | Devuelve la fecha y hora en el momento en que se evalúa la consulta |
CURDATE() | Fecha ( | Obtiene solo la fecha actual |
CURTIME() | Tiempo ( | Obtiene solo la hora actual |
CURRENT_TIMESTAMP | Fecha y Hora ( | Casi lo mismo que |
UTC_TIMESTAMP | Fecha y hora UTC ( | Devuelve tiempo UTC independientemente de la zona horaria |
Función NOW()
NOW() es la función más común para obtener la fecha y hora actuales.
Uso
SELECT NOW();
Ejemplo de Salida
+---------------------+
| NOW() |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
Características
NOW()obtiene la hora en el momento de la ejecución de la consulta.- Se devuelve como datos de tipo
DATETIME.
Función SYSDATE()
SYSDATE() también es una función que obtiene la fecha y hora actuales como NOW(), pero su comportamiento es diferente.
Uso
SELECT SYSDATE();
Ejemplo de Salida
+---------------------+
| SYSDATE() |
+---------------------+
| 2025-02-23 14:35:02 |
+---------------------+
Diferencia con NOW()
Nombre de la función | Cronograma de adquisición |
|---|---|
NOW() | Hora de inicio de la consulta |
SYSDATE() | Tiempo de evaluación de la consulta |
Por ejemplo, ejecutar una consulta como la siguiente mostrará la diferencia.
SELECT NOW(), SLEEP(2), NOW();
SELECT SYSDATE(), SLEEP(2), SYSDATE();
Resultado de Ejecución (Ejemplo)
+---------------------+----------+---------------------+
| NOW() | SLEEP(2) | NOW() |
+---------------------+----------+---------------------+
| 2025-02-23 14:35:00 | 0 | 2025-02-23 14:35:00 |
+---------------------+----------+---------------------+
+---------------------+----------+---------------------+
| SYSDATE() | SLEEP(2) | SYSDATE() |
+---------------------+----------+---------------------+
| 2025-02-23 14:35:00 | 0 | 2025-02-23 14:35:02 |
+---------------------+----------+---------------------+
Puntos
NOW()devuelve la hora al inicio de la ejecución de la consulta.SYSDATE()devuelve la hora en el punto de evaluación de la consulta, por lo que puede devolver un valor diferente después de retrasos comoSLEEP(2).
CURDATE() y CURTIME()
CURDATE() obtiene la fecha actual (YYYY-MM-DD), y CURTIME() obtiene la hora actual (HH:MM:SS).
Uso
SELECT CURDATE(), CURTIME();
Ejemplo de Salida
+------------+----------+
| CURDATE() | CURTIME() |
+------------+----------+
| 2025-02-23 | 14:35:00 |
+------------+----------+
Características
CURDATE()obtiene solo la fecha, por lo que se maneja como tipoDATE.CURTIME()obtiene solo la hora, por lo que se maneja como tipoTIME.
Función CURRENT_TIMESTAMP
CURRENT_TIMESTAMP es una función que funciona casi igual que NOW().
Uso
SELECT CURRENT_TIMESTAMP;
Ejemplo de salida
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
Características
NOW()yCURRENT_TIMESTAMPbásicamente devuelven el mismo valor.- Se puede usar como valor por defecto para columnas de tipo
TIMESTAMP.
CREATE TABLE sample (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Función UTC_TIMESTAMP()
UTC_TIMESTAMP() obtiene la hora actual en UTC (Tiempo Universal Coordinado).
Uso
SELECT UTC_TIMESTAMP();
Ejemplo de salida (Hora de Japón JST = UTC+9)
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2025-02-23 05:35:00 |
+---------------------+
Características
- Independientemente de la zona horaria del servidor, puede obtener la hora UTC.
- Es conveniente cuando el procesamiento requiere considerar zonas horarias.
Resumen de la comparación de funciones
Nombre de la Función | Datos Obtenidos | Cronograma de Adquisición | Main Uses |
|---|---|---|---|
NOW() | Fecha y Hora ( | Hora de inicio de ejecución de la consulta | Adquisición general de fecha y hora |
SYSDATE() | Fecha y Hora ( | Tiempo de evaluación de la consulta | Obtener diferentes tiempos dentro de una consulta |
CURDATE() | Fecha ( | Hora de inicio de ejecución de la consulta | Solo manejar fechas |
CURTIME() | Tiempo ( | Tiempo de inicio de ejecución de la consulta | Manejar solo los tiempos |
CURRENT_TIMESTAMP | Fecha y Hora ( | Hora de inicio de la ejecución de la consulta | Igual a |
UTC_TIMESTAMP | Fecha y hora UTC ( | Hora de inicio de ejecución de la consulta | Obtener hora UTC independientemente de la zona horaria |
3. Formateo y visualización de la hora actual
En MySQL, después de obtener la hora actual, puede haber casos en los que desee mostrarla no en el formato predeterminado YYYY-MM-DD HH:MM:SS, sino en un formato específico. Por ejemplo, casos como «querer obtener solo el año», «querer mostrar solo la porción de hora», «querer cambiar a formato YYYY/MM/DD».
En MySQL, esto se puede lograr usando la función DATE_FORMAT().
Fundamentos de la función DATE_FORMAT()
DATE_FORMAT() es una función que convierte los datos de fecha y hora especificados a un formato arbitrario.
Sintaxis
DATE_FORMAT(target date/time, 'format specifier')
Por ejemplo, para cambiar la hora actual obtenida con NOW() al formato YYYY/MM/DD HH:MM, ejecute la siguiente sentencia SQL.
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');
Ejemplo de salida
+----------------------+
| DATE_FORMAT(NOW()) |
+----------------------+
| 2025/02/23 14:35 |
+----------------------+
Puntos clave
%Y→ año de 4 dígitos (p. ej.: 2025)%m→ mes de 2 dígitos (p. ej.: 02)%d→ día de 2 dígitos (p. ej.: 23)%H→ hora en formato de 24 horas (p. ej.: 14)%i→ minutos (p. ej.: 35)
Lista de especificadores de formato de DATE_FORMAT()
Con DATE_FORMAT(), puede cambiar libremente el formato de fecha y hora usando símbolos como los siguientes.
Especificador | Descripción | Ejemplo de salida |
|---|---|---|
%Y | año de 4 dígitos | 2025 |
%y | año de 2 dígitos | 25 |
%m | mes de 2 dígitos (01-12) | 02 |
%c | Mes 1-12 | 2 |
%d | día de 2 dígitos (01-31) | 23 |
%e | Día 1-31 (sin cero inicial) | 23 |
%H | Hora en formato de 24 horas (00-23) | 14 |
%h | Hora en formato de 12 horas (01-12) | 02 |
%i | Minutes (00-59) | 35 |
%s | Segundos (00-59) | 50 |
%p | AM / PM notation | PM |
Ejemplos comunes de formato
(1) Mostrar en formato YYYY/MM/DD
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d');
Salida
+----------------------+
| DATE_FORMAT(NOW()) |
+----------------------+
| 2025/02/23 |
+----------------------+
(2) Notación usando etiquetas de año, mes y día para YYYY year MM month DD day
SELECT DATE_FORMAT(NOW(), '%Y year %m month %d day');
Salida
+----------------------+
| DATE_FORMAT(NOW()) |
+----------------------+
| 2025 year 02 month 23 day |
+----------------------+
(3) Mostrar en formato de 12 horas (AM/PM)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i %p');
Salida
+------------------------+
| DATE_FORMAT(NOW()) |
+------------------------+
| 2025-02-23 02:35 PM |
+------------------------+
Obtener solo la porción de hora o de fecha
En algunos casos, puede que desee obtener solo la fecha actual o obtener solo la hora actual.
(1) Obtener solo la fecha (YYYY-MM-DD)
SELECT CURDATE();
Salida
+------------+
| CURDATE() |
+------------+
| 2025-02-23 |
+------------+
(2) Obtener solo la hora (HH:MM:SS)
SELECT CURTIME();
Salida
+----------+
| CURTIME() |
+----------+
| 14:35:50 |
+----------+
Formatos que incluyen milisegundos (microsegundos)
Desde MySQL 5.6.4, mediante funciones como NOW(6), es posible obtener microsegundos (6 dígitos después del punto decimal).
(1) Obtener la hora actual con microsegundos
SELECT NOW(6);
Salida
+----------------------------+
| NOW(6) |
+----------------------------+
| 2025-02-23 14:35:50.123456 |
+----------------------------+
(2) Formato que incluye microsegundos
SELECT DATE_FORMAT(NOW(6), '%Y-%m-%d %H:%i:%s.%f');
Salida
+------------------------------+
| DATE_FORMAT(NOW(6)) |
+------------------------------+
| 2025-02-23 14:35:50.123456 |
+------------------------------+
Resumen
- Usar
DATE_FORMAT()permite formatear libremente fechas y horas. - Usar
CURDATE()oCURTIME()permite obtener solo la fecha o la hora. - Desde MySQL 5.6.4 en adelante, también se pueden manejar microsegundos.
- Puedes manejar diferentes formatos como la notación
AM/PM, el formatoYYYY/MM/DD,YYYY año MM mes DD día, y más.
4. Cálculos de fecha y hora usando la hora actual
MySQL permite cálculos de fecha y hora basados en la hora actual. Por ejemplo, puedes realizar operaciones como obtener la hora 1 hora después, la fecha 3 días atrás, o la diferencia entre dos fechas y horas.
INTERVAL para adición y sustracción de fechas y horas
En MySQL, puedes añadir y restar fechas y horas usando INTERVAL.
(1) Obtener la hora 1 hora después de la hora actual
SELECT NOW() AS Current Time, NOW() + INTERVAL 1 HOUR AS One Hour Later;
Salida
+---------------------+---------------------+
| Current Time | One Hour Later |
+---------------------+---------------------+
| 2025-02-23 14:35:00 | 2025-02-23 15:35:00 |
+---------------------+---------------------+
(2) Obtener la fecha 7 días después de la fecha actual
SELECT CURDATE() AS Today, CURDATE() + INTERVAL 7 DAY AS One Week Later;
Salida
+------------+------------+
| Today | One Week Later |
+------------+------------+
| 2025-02-23 | 2025-03-02 |
+------------+------------+
(3) Obtener la fecha 3 días antes de la fecha actual
SELECT CURDATE() AS Today, CURDATE() - INTERVAL 3 DAY AS Three Days Ago;
Salida
+------------+------------+
| Today | Three Days Ago |
+------------+------------+
| 2025-02-23 | 2025-02-20 |
+------------+------------+
(4) Obtener la fecha 1 mes después de una fecha y hora específica
SELECT DATE_ADD('2025-02-23', INTERVAL 1 MONTH) AS One Month Later;
Salida
+------------+
| One Month Later |
+------------+
| 2025-03-23 |
+------------+
(5) Obtener la fecha 1 año después de una fecha y hora específica
SELECT DATE_ADD('2025-02-23', INTERVAL 1 YEAR) AS One Year Later;
Salida
+------------+
| One Year Later |
+------------+
| 2026-02-23 |
+------------+
Cálculo de diferencia de fechas usando DATEDIFF()
Usando la función DATEDIFF(), puedes obtener la diferencia entre dos fechas en días.
(1) Calcular la diferencia entre dos fechas
SELECT DATEDIFF('2025-03-01', '2025-02-23') AS Day Difference;
Salida
+--------------+
| Day Difference |
+--------------+
| 6 |
+--------------+
(2) Calcular la diferencia entre la fecha actual y una fecha específica
SELECT DATEDIFF(NOW(), '2025-01-01') AS Days Elapsed;
Salida
+--------------+
| Days Elapsed |
+--------------+
| 53 |
+--------------+
Cálculo de diferencia de unidades de tiempo usando TIMESTAMPDIFF()
Usando TIMESTAMPDIFF(), puede realizar cálculos de diferencia en horas, minutos y segundos.
(1) Calcular la diferencia entre dos fechas y horas en horas
SELECT TIMESTAMPDIFF(HOUR, '2025-02-23 12:00:00', '2025-02-23 18:30:00') AS Time Difference;
Salida
+----------------+
| Time Difference |
+----------------+
| 6 |
+----------------+
(2) Calcular la diferencia entre dos fechas y horas en minutos
SELECT TIMESTAMPDIFF(MINUTE, '2025-02-23 12:00:00', '2025-02-23 12:30:00') AS Minute Difference;
Salida
+-----------------+
| Minute Difference |
+-----------------+
| 30 |
+-----------------+
(3) Calcular la diferencia entre dos fechas y horas en segundos
SELECT TIMESTAMPDIFF(SECOND, '2025-02-23 12:00:00', '2025-02-23 12:00:45') AS Second Difference;
Salida
+------------------+
| Second Difference |
+------------------+
| 45 |
+------------------+
Filtrado de rango de fechas usando BETWEEN
En casos donde desea recuperar datos dentro de un período específico de la base de datos, puede lograrlo fácilmente usando BETWEEN.
(1) Recuperar datos de la última semana
SELECT * FROM orders WHERE order_date BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE();
(Esta consulta recupera datos de pedidos de los últimos 7 días)
(2) Recuperar datos del 1 de febrero de 2025 al 15 de febrero de 2025
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01' AND '2025-02-15';
Resumen
- Usar
INTERVALfacilita agregar y restar fechas y horas. - Usar
DATEDIFF()permite cálculos de diferencia en días. - Usar
TIMESTAMPDIFF()permite cálculos de diferencia en horas, minutos y segundos. - Usar
BETWEENfacilita recuperar datos dentro de un período específico.

5. Configuración y gestión de zonas horarias
MySQL obtiene la hora actual según la zona horaria predeterminada del servidor. Sin embargo, al desarrollar especificaciones de sistemas o aplicaciones globales, puede ser necesario gestionar el tiempo en diferentes zonas horarias.
Cómo comprobar la zona horaria actual
En MySQL, puede comprobar la zona horaria configurada actualmente con la siguiente sentencia SQL.
SELECT @@global.time_zone, @@session.time_zone;
Ejemplo de salida
+--------------------+------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+------------------+
| SYSTEM | SYSTEM |
+--------------------+------------------+
Explicación
@@global.time_zoneindica la zona horaria del servidor.@@session.time_zoneindica la zona horaria de la sesión actual.
Por defecto, está configurado en SYSTEM, que utiliza la configuración de zona horaria del sistema operativo.
Cambiar la zona horaria por sesión
En MySQL, puede cambiar temporalmente la zona horaria. Por ejemplo, para cambiar a JST (Hora estándar de Japón), ejecute la siguiente sentencia SQL.
SET time_zone = 'Asia/Tokyo';
Alternativamente, para configurarla a UTC (Tiempo Universal Coordinado), haga lo siguiente.
SET time_zone = '+00:00';
Comprobación de la zona horaria después de configurarla
SELECT @@session.time_zone;
Ejemplo de salida
+------------------+
| @@session.time_zone |
+------------------+
| Asia/Tokyo |
+------------------+
Puntos clave
- Esta configuración solo se aplica a la sesión actual y se revierte cuando la conexión se desconecta.
- Para aplicarla de forma persistente, debe cambiar la configuración del servidor (ver la siguiente sección).
Cómo establecer la zona horaria predeterminada a nivel de servidor
Para cambiar la zona horaria predeterminada a nivel de servidor, edite el archivo de configuración de MySQL (my.cnf o my.ini) y establezca default_time_zone.
(1) Editar el archivo de configuración
Para Linux (my.cnf):
[mysqld]
default_time_zone = 'Asia/Tokyo'
Para Windows (my.ini):
[mysqld]
default_time_zone = '+09:00'
(2) Reiniciar MySQL
Después de cambiar la configuración, reinicia el servidor MySQL.
Linux:
sudo systemctl restart mysql
Windows:
net stop mysql
net start mysql
(3) Verificar la Configuración
SELECT @@global.time_zone;
Ejemplo de Salida
+--------------------+
| @@global.time_zone |
+--------------------+
| Asia/Tokyo |
+--------------------+
Obtener la hora UTC (UTC_TIMESTAMP())
Al construir sistemas globales, es importante manejar la hora UTC unificada sin depender de la zona horaria del servidor.
En MySQL, puedes obtener la hora UTC actual usando UTC_TIMESTAMP().
SELECT UTC_TIMESTAMP();
Ejemplo de Salida
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2025-02-23 05:35:00 |
+---------------------+
Puntos Clave
UTC_TIMESTAMP()no se ve afectado por la zona horaria.- Es conveniente para gestionar datos globales sin especificar una zona horaria.
Conversión de Tiempo usando CONVERT_TZ()
Puedes convertir una fecha y hora de una zona horaria a otra usando CONVERT_TZ() de MySQL.
(1) Convertir de UTC a JST
SELECT CONVERT_TZ('2025-02-23 05:35:00', '+00:00', '+09:00') AS Japanese Time;
Salida
+---------------------+
| Japanese Time |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
(2) Usar Nombres de Zona Horaria
Si la tabla time_zone de MySQL está configurada, puedes especificar nombres de zona horaria para la conversión de la siguiente manera.
SELECT CONVERT_TZ('2025-02-23 05:35:00', 'UTC', 'Asia/Tokyo');
Salida
+---------------------+
| Japanese Time |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
(3) Actualizar los Datos de Zona Horaria de MySQL
Al usar CONVERT_TZ() en MySQL, la tabla time_zone puede estar vacía. En ese caso, puedes actualizar los datos con el siguiente comando (entorno Linux).
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Resumen
- Puedes verificar la zona horaria actual con
SELECT @@global.time_zone, @@session.time_zone;. - Puedes cambiar la zona horaria por sesión con
SET time_zone = 'Asia/Tokyo';. - Al establecer
default_time_zoneenmy.cnfy reiniciar MySQL, puedes cambiar la zona horaria a nivel de servidor. - Usar
UTC_TIMESTAMP()te permite obtener la hora UTC independientemente de la zona horaria del servidor. - Usar
CONVERT_TZ()permite convertir entre diferentes zonas horarias.
6. Cómo establecer la marca de tiempo actual como valor predeterminado
En el diseño de bases de datos, es común necesitar establecer la marca de tiempo actual como valor predeterminado para ciertas columnas en una tabla. Por ejemplo, al registrar automáticamente la fecha y hora de creación o la fecha y hora de actualización de los registros.
Establecer CURRENT_TIMESTAMP como el Valor Predeterminado
En MySQL, puedes establecer CURRENT_TIMESTAMP como valor predeterminado para columnas de tipo TIMESTAMP o DATETIME. Esto establece automáticamente la hora actual cuando se inserta un registro.
(1) Establecer CURRENT_TIMESTAMP como el Valor Predeterminado
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Al insertar datos en esta tabla, la columna created_at se establecerá automáticamente a la hora actual.
INSERT INTO users (name) VALUES ('Alice');
SELECT * FROM users;
Salida
+----+-------+---------------------+
| id | name | created_at |
+----+-------+---------------------+
| 1 | Alice | 2025-02-23 14:35:00 |
+----+-------+---------------------+
Actualizaciones Automáticas con ON UPDATE CURRENT_TIMESTAMP
Puedes combinar CURRENT_TIMESTAMP con la cláusula ON UPDATE para establecer automáticamente la hora actual cuando se actualiza un registro.
(1) Establecer ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
- El campo
created_atse establece al tiempo actual solo en la creación inicial del registro. - El campo
updated_atse actualiza automáticamente al tiempo actual cuando el registro se actualiza.
(2) Inserción de Datos
INSERT INTO users (name) VALUES ('Bob');
SELECT * FROM users;
Salida
+----+------+---------------------+---------------------+
| id | name | created_at | updated_at |
+----+------+---------------------+---------------------+
| 1 | Bob | 2025-02-23 14:40:00 | 2025-02-23 14:40:00 |
+----+------+---------------------+---------------------+
(3) Actualización de Datos
UPDATE users SET name = 'Bobby' WHERE id = 1;
SELECT * FROM users;
Salida
+----+-------+---------------------+---------------------+
| id | name | created_at | updated_at |
+----+-------+---------------------+---------------------+
| 1 | Bobby | 2025-02-23 14:40:00 | 2025-02-23 14:42:10 |
+----+-------+---------------------+---------------------+
De esta manera, el valor de updated_at se actualiza automáticamente.
Diferencias entre los tipos DATETIME y TIMESTAMP
En MySQL, existen dos tipos para manejar fechas y horas: DATETIME y TIMESTAMP. Es importante comprender sus características y usarlos adecuadamente.
Tipo | Rango de Almacenamiento | Tamaño de almacenamiento | Influencia de la zona horaria | Uso de |
|---|---|---|---|---|
DATETIME | 1000-01-01 00:00:009999-12-31 23:59:59 | 8 bytes | None | Puede establecerse explícitamente |
TIMESTAMP | 1970-01-01 00:00:01 UTC2038-01-19 03:14:07 UTC | 4 bytes | Sí | Puede usar |
Puntos para elegir entre ellos
- Casos para usar
DATETIME - No se desea que las zonas horarias influyan (se desea almacenar fechas y horas fijas).
- Posibilidad de manejar datos después de 2038.
- Casos para usar
TIMESTAMP - Se desea manejar las horas según la zona horaria predeterminada de MySQL.
- Se desea usar
CURRENT_TIMESTAMPcomo valor predeterminado (se requiere configuración explícita paraDATETIME).
Por qué no puedes establecer NOW() como valor predeterminado
Aunque CURRENT_TIMESTAMP puede usarse como valor predeterminado, la función NOW() no puede establecerse directamente como valor predeterminado.
(1) Intentar establecer NOW() como valor predeterminado genera un error
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at DATETIME DEFAULT NOW()
);
Error
ERROR 1067 (42000): Invalid default value for 'created_at'
Este error indica que NOW() es una función y no puede usarse directamente como valor predeterminado.
(2) Solución
En su lugar, use CURRENT_TIMESTAMP.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Además, si desea usar NOW(), también puede usar un disparador BEFORE INSERT.
CREATE TRIGGER set_created_at BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
Resumen
- Al establecer
CURRENT_TIMESTAMPcomoDEFAULT, puede insertar automáticamente el tiempo actual al crear un registro. - Establecer
ON UPDATE CURRENT_TIMESTAMPactualiza automáticamente la marca de tiempo cuando el registro se actualiza. - Es importante comprender las diferencias entre
DATETIMEyTIMESTAMPy usarlos adecuadamente. NOW()no puede usarse como valor predeterminado, peroCURRENT_TIMESTAMPpuede sustituirlo.- Usar un disparador
BEFORE INSERTle permite manejarNOW()como un valor predeterminado.
7. Ejemplos prácticos usando la hora actual de MySQL
Después de aprender cómo obtener y manipular la hora actual en MySQL, a continuación, analicemos específicamente cómo se puede utilizar en negocios reales o en el desarrollo.
Esta sección presenta los siguientes ejemplos prácticos.
- Agregar la hora actual a los registros de log
- Obtener datos de las últimas 24 horas
- Actualizar la última hora de inicio de sesión del usuario
- Registrar automáticamente las fechas de creación y actualización de datos
- SQL para obtener datos dentro de un período determinado
Añadiendo la hora actual a los registros de log
Al registrar logs del sistema o logs de errores, es común guardarlos junto con la fecha y hora de ocurrencia. Esto facilita la solución de problemas.
(1) Creación de la tabla de logs
CREATE TABLE system_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_type VARCHAR(255),
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
(2) Añadiendo un log
INSERT INTO system_logs (event_type, message)
VALUES ('ERROR', 'Failed to connect to server');
(3) Obteniendo los logs más recientes
SELECT * FROM system_logs ORDER BY created_at DESC LIMIT 10;
De esta manera, al usar CURRENT_TIMESTAMP, la fecha y hora de creación del log se pueden registrar automáticamente.
Obtención de datos de las últimas 24 horas
En sitios EC o sistemas de gestión de usuarios, etc., existen casos frecuentes donde «queremos obtener eventos u órdenes que ocurrieron en las últimas 24 horas«.
(1) Obtención de usuarios registrados en las últimas 24 horas
SELECT * FROM users WHERE created_at >= NOW() - INTERVAL 1 DAY;
Al ejecutar esta consulta se obtienen usuarios registrados en las últimas 24 horas a partir del momento actual.
(2) Obtención de órdenes de las últimas 24 horas
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 1 DAY;
Actualización de la última hora de inicio de sesión del usuario
Al actualizar la hora de último inicio de sesión cada vez que un usuario inicia sesión, se vuelve posible la gestión de usuarios activos.
(1) Creación de la tabla de usuarios
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255),
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
last_loginse actualiza automáticamente cada vez que el usuario inicia sesión.
(2) Actualización de la hora de inicio de sesión cuando un usuario inicia sesión
UPDATE users SET last_login = NOW() WHERE id = 1;
(3) Obtención de usuarios cuya última sesión fue hace más de 1 semana
SELECT * FROM users WHERE last_login < NOW() - INTERVAL 7 DAY;
Con esta consulta podemos extraer usuarios cuya última sesión fue hace más de 1 semana.
Registro automático de fechas y horas de creación y actualización de datos
En bases de datos, es común gestionar automáticamente la fecha/hora de creación y la fecha/hora de actualización de los registros.
(1) Tabla que registra automáticamente las fechas y horas de creación y actualización
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
created_at→ Se establece automáticamente cuando se crea el registroupdated_at→ Se actualiza automáticamente cada vez que se actualiza el registro
(2) Añadiendo un nuevo artículo
INSERT INTO articles (title, content)
VALUES ('How to Use MySQL's Current Time', 'This explains in detail the MySQL NOW() function.');
(3) Actualizando el contenido del artículo
UPDATE articles SET content = 'In addition to NOW(), we also explain CURRENT_TIMESTAMP in detail.'
WHERE id = 1;
De esta manera, cada vez que se actualiza el registro, updated_at cambia automáticamente, por lo que no es necesario establecer manualmente la fecha y hora de actualización.
SQL para obtener datos dentro de un período determinado
Obtener datos registrados dentro de un período específico es útil para el análisis de ventas y la medición de la actividad del usuario.
(1) Obtención de órdenes dentro del período especificado
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01' AND '2025-02-15';
Esta consulta obtiene órdenes desde el 1 de febrero de 2025 hasta el 15 de febrero de 2025.
(2) Obtención de usuarios registrados en el último mes
SELECT * FROM users WHERE created_at >= NOW() - INTERVAL 1 MONTH;
- Al usar
INTERVAL 1 MONTH, podemos obtener usuarios registrados en el último mes.
Resumen
- Al usar
CURRENT_TIMESTAMP, podemos registrar automáticamente la hora de creación de registros y eventos. - Al usar
NOW() - INTERVAL X DAY, podemos obtener fácilmente datos de los últimos X días. - Al utilizar
ON UPDATE CURRENT_TIMESTAMP, podemos gestionar automáticamente la última hora de inicio de sesión del usuario. - Al usar
BETWEEN, podemos obtener datos dentro de un período específico. - Es conveniente utilizar
TIMESTAMPpara gestionar las fechas y horas de creación y actualización de datos.
8. Preguntas Frecuentes (FAQ)
Al realizar operaciones relacionadas con la hora actual en MySQL, puede encontrarse con varias preguntas o problemas. En esta sección, explicamos preguntas comunes y sus soluciones en formato de preguntas y respuestas.
NOW() y CURRENT_TIMESTAMP: ¿Cuál es la diferencia?
P: Ambos NOW() y CURRENT_TIMESTAMP pueden recuperar la hora actual, pero ¿existen diferencias?
R: Realizan casi la misma operación, pero hay ligeras diferencias.
Nombre de la función | Tipo de datos devuelto | Principales Diferencias |
|---|---|---|
NOW() | DATETIME | Devuelve el tiempo de ejecución de la consulta |
CURRENT_TIMESTAMP | TIMESTAMP | Puede usarse como valor predeterminado para columnas de tipo |
En especial, CURRENT_TIMESTAMP puede aplicarse automáticamente a columnas de tipo TIMESTAMP, por lo que es útil en muchos escenarios de diseño de tablas.
Quiero obtener la hora actual con NOW(), pero no funciona correctamente
P: Incluso cuando ejecuto SELECT NOW();, no obtengo la hora esperada. ¿Cuál es la causa?
R: Las posibles causas son las siguientes.
- La zona horaria del servidor no está configurada adecuadamente
SELECT @@global.time_zone, @@session.time_zone;
Utilice esto para verificar las zonas horarias del servidor y de la sesión, y cámbielas según sea necesario.
SET time_zone = 'Asia/Tokyo';
- La zona horaria en la configuración de MySQL está establecida en
SYSTEM
- En el caso de
SYSTEM, depende de la configuración de zona horaria del sistema operativo. - Por lo tanto, es importante unificar la zona horaria de MySQL y del sistema operativo.
Causas de deriva de tiempo en CURRENT_TIMESTAMP y soluciones
P: Aunque establecí CURRENT_TIMESTAMP como valor predeterminado, ¿cuál es la causa si la hora difiere de la esperada?
R: Se pueden considerar varios factores.
- La zona horaria de la base de datos y la de la aplicación son diferentes
- Verifiquemos con
SELECT @@global.time_zone, @@session.time_zone;. - Si son diferentes, recomendamos unificarlas.
- A diferencia del tipo
DATETIME, el tipoTIMESTAMPse ve afectado por la zona horaria del servidor
- Si desea evitar la influencia de la zona horaria, es mejor usar el tipo
DATETIME.
Razones por las que NOW() no puede establecerse como valor predeterminado
P: Cuando intento establecer NOW() como valor predeterminado, obtengo un error. ¿Por qué?
R: NOW() es una función, y MySQL tiene una restricción que las funciones no pueden usarse como valores predeterminados.
Ejemplo de error
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'
✅ Solución
En su lugar, usemos CURRENT_TIMESTAMP.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Alternativamente, también existe un método usando triggers.
CREATE TRIGGER set_created_at BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
Cómo manejar casos donde la especificación de rango usando BETWEEN no funciona
P: Intenté recuperar datos en un rango específico usando BETWEEN, pero no funciona correctamente.
R: Al usar BETWEEN, las diferencias en tipos de datos o truncamiento de tiempo, etc., pueden causar resultados inesperados.
(1) Uso correcto de BETWEEN
Por ejemplo, al recuperar datos desde el 1 de febrero de 2025 hasta el 10 de febrero de 2025:
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01 00:00:00' AND '2025-02-10 23:59:59';
Puntos
- Omitir la hora como
BETWEEN '2025-02-01' AND '2025-02-10'resulta en un juicio a las 00:00:00, lo que puede llevar a resultados no deseados. - Especificar explícitamente
23:59:59permite una especificación correcta del rango hasta el final del día.
Casos en los que debes usar SYSDATE() y casos en los que no
P: ¿Cuál es la diferencia entre SYSDATE() y NOW()? ¿Cuándo debo usarlo?
R: SYSDATE() es similar a NOW(), pero la diferencia es que recupera la hora en el momento de la evaluación, no en el punto de ejecución de la consulta.
(1) En el caso de NOW()
SELECT NOW(), SLEEP(2), NOW();
Salida
+---------------------+----------+---------------------+
| NOW() | SLEEP(2) | NOW() |
+---------------------+----------+---------------------+
| 2025-02-23 14:00:00 | 0 | 2025-02-23 14:00:00 |
+---------------------+----------+---------------------+
(2) En el caso de SYSDATE()
SELECT SYSDATE(), SLEEP(2), SYSDATE();
Salida
+---------------------+----------+---------------------+
| SYSDATE() | SLEEP(2) | SYSDATE() |
+---------------------+----------+---------------------+
| 2025-02-23 14:00:00 | 0 | 2025-02-23 14:00:02 |
+---------------------+----------+---------------------+
✅ Casos en los que debes usar SYSDATE()
- Cuando quieras registrar estrictamente la hora de ejecución de cada consulta dentro de una transacción.
- Cuando registres logs o datos en tiempo real y busques una temporización precisa.
Resumen
NOW()yCURRENT_TIMESTAMPson casi iguales, peroCURRENT_TIMESTAMPes conveniente al usarlo con el tipoTIMESTAMP.- Al especificar rangos de fechas con
BETWEEN, incluye hasta23:59:59. SYSDATE()es útil en situaciones donde se necesita la hora en tiempo real.
9. Resumen
En las secciones anteriores, hemos explicado en detalle cómo obtener, manipular y gestionar la hora actual en MySQL. En esta sección final, revisaremos cada punto y organizaremos los aspectos importantes para manejar correctamente la hora actual en MySQL.
Resumen de Métodos para Obtener la Hora Actual en MySQL
Nombre de la Función | Datos Obtenidos | Momento de adquisición | Main Uses |
|---|---|---|---|
NOW() | YYYY-MM-DD HH:MM:SS | En la Ejecución de la Consulta | Adquisición General del Tiempo Actual |
SYSDATE() | YYYY-MM-DD HH:MM:SS | En la Evaluación de Consultas | Adquisición de Tiempo en Tiempo Real |
CURDATE() | YYYY-MM-DD | En la Ejecución de la Consulta | Obtener solo la fecha actual |
CURTIME() | HH:MM:SS | En la Ejecución de la Consulta | Obtener solo la hora actual |
CURRENT_TIMESTAMP | YYYY-MM-DD HH:MM:SS | En la Ejecución de la Consulta | Casi igual a |
UTC_TIMESTAMP() | YYYY-MM-DD HH:MM:SS | En la Ejecución de la Consulta | Obtener hora actual en UTC |
✅NOW() es la función más utilizada, ¡pero otras funciones pueden emplearse según el propósito!
Formateo y Manipulación de la Hora Actual
El tiempo obtenido debe ser formateado en una forma más legible o extraer solo partes específicas, lo cual es importante.
- Formatear usando
DATE_FORMAT()
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
Salida
2025-02-23 14:35:00
- Obtener solo las partes de fecha y hora
SELECT CURDATE(), CURTIME();
Salida
+------------+----------+
| 2025-02-23 | 14:35:00 |
+------------+----------+
Cálculos con la Hora Actual
- Sumar o restar tiempo usando
INTERVAL
SELECT NOW() + INTERVAL 1 HOUR; -- 1 hour later
SELECT NOW() - INTERVAL 3 DAY; -- 3 days ago
- Calcular la diferencia en días
SELECT DATEDIFF('2025-03-01', '2025-02-23');
Salida
6 days
- Calcular la diferencia en tiempo
SELECT TIMESTAMPDIFF(HOUR, '2025-02-23 12:00:00', '2025-02-23 18:30:00');
Salida
6 hours
Gestión de la Zona Horaria
- Verificar la zona horaria actual
SELECT @@global.time_zone, @@session.time_zone;
- Cambiar la zona horaria por sesión
SET time_zone = 'Asia/Tokyo';
- Convertir entre diferentes zonas horarias
SELECT CONVERT_TZ('2025-02-23 05:35:00', 'UTC', 'Asia/Tokyo');
Salida
2025-02-23 14:35:00
Establecer la Hora Actual como Valor Predeterminado
- Registrar automáticamente la fecha y hora al crear un registro
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- Actualizar automáticamente
updated_atal actualizar
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Ejemplos prácticos del tiempo actual en MySQL
- Registro de logs
INSERT INTO system_logs (event_type, message)
VALUES ('ERROR', 'Server connection failed');
- Obtener datos de las últimas 24 horas
SELECT * FROM users WHERE created_at >= NOW() - INTERVAL 1 DAY;
- Actualizar la última hora de inicio de sesión
UPDATE users SET last_login = NOW() WHERE id = 1;
- Obtener datos dentro de un período determinado
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01' AND '2025-02-15';
Próximos pasos
- Intenta usar SQL para obtener la hora actual en MySQL (
SELECT NOW();etc.) - Intenta construir SQL real usando cálculos de fechas y formato
- Aplica a aplicaciones reales (registro de logs, gestión de usuarios, etc.)
Conclusión
✅Usar NOW() o CURRENT_TIMESTAMP permite adquirir fácilmente la hora actual
✅Usar DATE_FORMAT() permite convertir la hora en un formato más legible
✅Usar INTERVAL o DATEDIFF() permite realizar cálculos de fechas y horas
✅Usar el tipo TIMESTAMP permite registrar automáticamente las fechas y horas de creación y actualización
✅ Una gestión adecuada de zonas horarias permite manejar correctamente las horas en distintas regiones
Manejar correctamente la hora actual en MySQL es importante en todos los escenarios, como gestión de logs, agregación de datos y procesamiento de transacciones. ¡Utiliza lo que aprendiste en este artículo para lograr operaciones de base de datos más eficientes!


