Guía completa: Gestión del tiempo actual en MySQL | NOW() vs CURRENT_TIMESTAMP

目次

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 (YYYY-MM-DD HH:MM:SS)

Devuelve la fecha y hora en el momento de la ejecución de la consulta.

SYSDATE()

Fecha y Hora (YYYY-MM-DD HH:MM:SS)

Devuelve la fecha y hora en el momento en que se evalúa la consulta

CURDATE()

Fecha (YYYY-MM-DD)

Obtiene solo la fecha actual

CURTIME()

Tiempo (HH:MM:SS)

Obtiene solo la hora actual

CURRENT_TIMESTAMP

Fecha y Hora (YYYY-MM-DD HH:MM:SS)

Casi lo mismo que NOW()

UTC_TIMESTAMP

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

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 como SLEEP(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 tipo DATE.
  • CURTIME() obtiene solo la hora, por lo que se maneja como tipo TIME.

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() y CURRENT_TIMESTAMP bá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 (YYYY-MM-DD HH:MM:SS)

Hora de inicio de ejecución de la consulta

Adquisición general de fecha y hora

SYSDATE()

Fecha y Hora (YYYY-MM-DD HH:MM:SS)

Tiempo de evaluación de la consulta

Obtener diferentes tiempos dentro de una consulta

CURDATE()

Fecha (YYYY-MM-DD)

Hora de inicio de ejecución de la consulta

Solo manejar fechas

CURTIME()

Tiempo (HH:MM:SS)

Tiempo de inicio de ejecución de la consulta

Manejar solo los tiempos

CURRENT_TIMESTAMP

Fecha y Hora (YYYY-MM-DD HH:MM:SS)

Hora de inicio de la ejecución de la consulta

Igual a NOW(), puede usarse como valor predeterminado

UTC_TIMESTAMP

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

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() o CURTIME() 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 formato YYYY/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 INTERVAL facilita 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 BETWEEN facilita 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_zone indica la zona horaria del servidor.
  • @@session.time_zone indica 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_zone en my.cnf y 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_at se establece al tiempo actual solo en la creación inicial del registro.
  • El campo updated_at se 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 CURRENT_TIMESTAMP

DATETIME1000-01-01 00:00:009999-12-31 23:59:59

8 bytes

None

Puede establecerse explícitamente

TIMESTAMP1970-01-01 00:00:01 UTC2038-01-19 03:14:07 UTC

4 bytes

Puede usar CURRENT_TIMESTAMP como valor predeterminado

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_TIMESTAMP como valor predeterminado (se requiere configuración explícita para DATETIME).

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_TIMESTAMP como DEFAULT, puede insertar automáticamente el tiempo actual al crear un registro.
  • Establecer ON UPDATE CURRENT_TIMESTAMP actualiza automáticamente la marca de tiempo cuando el registro se actualiza.
  • Es importante comprender las diferencias entre DATETIME y TIMESTAMP y usarlos adecuadamente.
  • NOW() no puede usarse como valor predeterminado, pero CURRENT_TIMESTAMP puede sustituirlo.
  • Usar un disparador BEFORE INSERT le permite manejar NOW() 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_login se 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_atSe establece automáticamente cuando se crea el registro
  • updated_atSe 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 TIMESTAMP para 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_TIMESTAMPTIMESTAMP

Puede usarse como valor predeterminado para columnas de tipo TIMESTAMP

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.

  1. 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';
  1. 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.

  1. 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.
  1. A diferencia del tipo DATETIME, el tipo TIMESTAMP se 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:59 permite 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() y CURRENT_TIMESTAMP son casi iguales, pero CURRENT_TIMESTAMP es conveniente al usarlo con el tipo TIMESTAMP.
  • Al especificar rangos de fechas con BETWEEN, incluye hasta 23: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_TIMESTAMPYYYY-MM-DD HH:MM:SS

En la Ejecución de la Consulta

Casi igual a NOW()

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_at al 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!