1. ¿Qué es un timestamp en MySQL?
El tipo de dato TIMESTAMP
en MySQL se utiliza para almacenar un momento específico como UTC (Tiempo Universal Coordinado), gestionando automáticamente la conversión de zonas horarias tanto al guardar como al recuperar los datos. Este tipo de dato puede manejar fechas y horas en el rango desde el 1 de enero de 1970 hasta el 19 de enero de 2038. Al almacenar en la base de datos, TIMESTAMP
usa la zona horaria actual, y al recuperarlo, se convierte automáticamente en función de la zona horaria del sistema.
Diferencias entre TIMESTAMP y DATETIME
Un tipo de dato que se compara frecuentemente con TIMESTAMP
es DATETIME
. DATETIME
almacena la fecha y hora en el formato tal cual, sin verse afectado por la zona horaria. En cambio, TIMESTAMP
se convierte a UTC al momento de guardarse y se transforma de nuevo a la zona horaria del sistema al recuperarse, lo que ayuda a evitar desajustes entre zonas horarias.
Por ejemplo, TIMESTAMP
es especialmente útil en casos de migración de sistemas o cuando se trabaja con bases de datos distribuidas en múltiples zonas horarias. Por otro lado, DATETIME
maneja un rango mucho más amplio, desde el año 1000 hasta el 9999, y suele utilizarse para evitar el problema del año 2038.
Ejemplo de uso de TIMESTAMP
Se puede crear una tabla utilizando TIMESTAMP
de la siguiente manera:
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
En este ejemplo, la columna event_time
guarda automáticamente la hora actual cuando se inserta un registro y se actualiza cada vez que dicho registro es modificado.
2. Uso básico de timestamp
Al trabajar con TIMESTAMP
en MySQL, es importante conocer los métodos básicos para insertar y recuperar valores. A continuación, se presentan algunos ejemplos de cómo manipular datos con TIMESTAMP
.
Insertar fecha y hora
Para insertar datos en una columna TIMESTAMP
, normalmente se especifica la fecha y la hora en formato de cadena. La fecha se representa como “YYYY-MM-DD” y la hora como “hh:mm:ss”.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
Esta instrucción SQL inserta el valor del 1 de octubre de 2023 a las 12:30 en la columna event_time
.
Insertar la hora actual
Con la función NOW()
de MySQL se puede obtener fácilmente la fecha y hora actual. Esta función devuelve la hora del sistema según la zona horaria configurada, y se puede insertar directamente en un campo TIMESTAMP
.
INSERT INTO events (event_time) VALUES (NOW());
En este ejemplo, se inserta automáticamente la hora exacta en que se ejecuta la instrucción SQL.
Usar la función de actualización automática
Si se especifica ON UPDATE CURRENT_TIMESTAMP
en una columna TIMESTAMP
, se registrará automáticamente la hora de la última modificación cada vez que el registro sea actualizado.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
En esta tabla, la columna order_time
guarda la hora actual cuando se crea un nuevo registro y se actualiza automáticamente cada vez que el registro es modificado.

3. Manejo de timestamp y zonas horarias
Una de las principales características de TIMESTAMP
es su capacidad de manejar zonas horarias. Los datos siempre se convierten a formato UTC al almacenarse y se transforman de nuevo a la zona horaria del sistema al recuperarse.
Cómo verificar la configuración de la zona horaria
En MySQL es posible configurar la zona horaria a nivel de servidor o de sesión. Para comprobar la configuración actual se utiliza el comando SHOW VARIABLES
:
SHOW VARIABLES LIKE 'time_zone';
Este comando devuelve la zona horaria actualmente configurada en la base de datos. Para cambiarla, se puede ejecutar lo siguiente:
SET time_zone = '+09:00';
Diferencias de zona horaria entre TIMESTAMP y DATETIME
El tipo DATETIME
almacena la fecha y hora sin considerar la zona horaria, mientras que TIMESTAMP
siempre convierte a UTC al guardar. Por esta razón, en entornos donde se manejan múltiples zonas horarias, TIMESTAMP
es la opción más adecuada.
4. El problema del año 2038 y su impacto
El problema del año 2038 surge de la limitación del tipo TIMESTAMP
en sistemas de 32 bits. Este tipo se basa en el número de segundos transcurridos desde el 1 de enero de 1970 00:00:00 UTC. Al llegar al 19 de enero de 2038 a las 03:14:07 UTC, este valor supera el límite y provoca un desbordamiento.
Cómo evitar el problema del 2038
Para evitar este problema se recomienda usar sistemas de 64 bits o bien utilizar el tipo DATETIME
, que soporta un rango mucho más amplio (desde el año 1000 hasta el 9999). De esta forma, se puede trabajar sin preocupaciones más allá del año 2038.
Otra solución es actualizar el sistema. Los entornos de 64 bits no presentan esta limitación, por lo que es importante considerar la actualización tanto de la base de datos como de las aplicaciones relacionadas.

5. Ejemplos prácticos del tipo timestamp
El tipo TIMESTAMP
en MySQL no solo se usa para almacenar fechas y horas básicas, sino también para registrar y actualizar automáticamente la hora actual. Existen varios casos prácticos en los que puede aplicarse. A continuación, algunos ejemplos:
Insertar automáticamente la hora actual
Al configurar una columna TIMESTAMP
con el valor por defecto CURRENT_TIMESTAMP
, se inserta automáticamente la fecha y hora actual cada vez que se crea un nuevo registro. Por ejemplo, si se desea registrar automáticamente el momento en que se genera un pedido:
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Registrar automáticamente la hora de actualización
Al añadir ON UPDATE CURRENT_TIMESTAMP
, se guarda automáticamente la fecha y hora de la última actualización de un registro. Esto resulta útil para llevar un control automático del historial de modificaciones.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Uso de múltiples columnas TIMESTAMP
En MySQL es posible incluir varias columnas TIMESTAMP
en una misma tabla. Sin embargo, solo una puede tener CURRENT_TIMESTAMP
como valor por defecto. Si se necesita gestionar múltiples marcas de tiempo automáticas, es recomendable asignar valores explícitos a las demás columnas o utilizar el tipo DATETIME
.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
6. Consideraciones al usar el tipo timestamp
Existen varios aspectos que deben tenerse en cuenta al trabajar con TIMESTAMP
. Comprender estas limitaciones ayuda a evitar errores o inconsistencias en los datos.
Restricciones de NULL y valores por defecto
De manera predeterminada, las columnas TIMESTAMP
incluyen la restricción NOT NULL
. Para permitir valores nulos, se debe especificar explícitamente DEFAULT NULL
:
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
También es posible usar DEFAULT 0
, lo que asigna el valor inválido 0000-00-00 00:00:00
. Sin embargo, esta práctica no se recomienda, ya que en el modo estricto de MySQL puede generar errores.
El problema de 0000-00-00 00:00:00
Algunas versiones de MySQL permiten el valor inválido 0000-00-00 00:00:00
, pero su uso puede ocasionar problemas en entornos donde la integridad de los datos es prioritaria. Es preferible utilizar valores NULL
u otros valores predeterminados válidos.
CREATE TABLE sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
end_time TIMESTAMP NULL
);
Impacto de la zona horaria del sistema
Como TIMESTAMP
siempre se almacena en UTC, es importante prestar atención al migrar bases de datos entre servidores con diferentes configuraciones de zona horaria. Si se cambia la zona horaria del servidor, las marcas de tiempo pueden mostrarse con horas inesperadas. Es fundamental gestionar de forma consistente la zona horaria del sistema.
SET time_zone = 'Asia/Tokyo';
Con este comando, la base de datos se ajusta a la zona horaria de Tokio, garantizando una conversión precisa desde UTC.

7. Conclusión y recomendaciones
El tipo TIMESTAMP
es una herramienta poderosa en MySQL para gestionar fechas y horas de manera eficiente. Sus principales ventajas son la conversión automática según la zona horaria y la capacidad de registrar automáticamente la fecha y hora de creación o actualización de registros. Sin embargo, es importante tener presentes sus limitaciones, como el problema del año 2038 o el manejo de valores NULL.
Cuándo se recomienda usar TIMESTAMP
- Si necesitas registro automático de actualizaciones,
TIMESTAMP
es ideal. Especialmente útil para mantener la hora de modificación de los registros sin intervención manual. - En sistemas que consideran zonas horarias, la conversión automática a partir de UTC ofrece una ventaja significativa.
- Por otro lado, si se requiere mayor rango temporal o trabajar con fechas más allá de 2038, es preferible optar por el tipo
DATETIME
.
En definitiva, se recomienda elegir entre TIMESTAMP
y DATETIME
en función de los requisitos específicos del sistema, asegurando consistencia y facilidad de mantenimiento en los datos.
8. Preguntas frecuentes (FAQ)
El uso de TIMESTAMP
en MySQL genera dudas comunes entre desarrolladores. A continuación, algunas de las más frecuentes junto con sus respuestas:
¿Cómo decidir entre TIMESTAMP
y DATETIME
?
TIMESTAMP
es más adecuado para aplicaciones que requieren conversión automática entre zonas horarias y para registrar automáticamente la hora de creación o actualización de registros. En cambio, DATETIME
es mejor cuando se necesita mantener fechas y horas constantes sin que se vean afectadas por la zona horaria.
¿Es cierto que TIMESTAMP
dejará de funcionar después de 2038?
Sí. El problema del año 2038 afecta a sistemas de 32 bits que utilizan TIMESTAMP
, ya que se basa en los segundos transcurridos desde 1970-01-01. A partir del 19 de enero de 2038, los valores dejan de ser válidos. La solución es migrar a sistemas de 64 bits o utilizar DATETIME
.
¿Cómo permitir valores NULL en una columna TIMESTAMP
?
Para que una columna TIMESTAMP
acepte valores nulos, es necesario declarar explícitamente DEFAULT NULL
. Ejemplo:
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
Con esta configuración, si no se especifica un valor al insertar, se almacenará NULL
.
¿Cambiar la zona horaria afecta los datos ya guardados?
Sí, aunque los valores se almacenan en UTC, al cambiar la configuración de la zona horaria, la fecha y hora mostrada cambia en la recuperación de datos. Por eso, para mantener consistencia, es recomendable unificar la configuración de la zona horaria en todo el sistema.
¿Con CURRENT_TIMESTAMP
no se pueden insertar fechas personalizadas?
No. Aunque CURRENT_TIMESTAMP
inserta la fecha y hora actual automáticamente, aún es posible especificar manualmente un valor concreto utilizando NOW()
o una cadena en formato de fecha.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
De esta manera, se pueden insertar valores personalizados en lugar del valor actual.