¿Debo utilizar el tipo de datos de fecha y hora o marca de tiempo en MySQL?
¿Recomendaría usar un campo de fecha y hora o de marca de tiempo y por qué (usando MySQL)?
Estoy trabajando con PHP en el lado del servidor.
Las marcas de tiempo en MySQL generalmente se usan para rastrear cambios en los registros y, a menudo, se actualizan cada vez que se cambia el registro. Si desea almacenar un valor específico, debe utilizar un campo de fecha y hora.
Si quiso decir que quiere decidir entre usar una marca de tiempo UNIX o un campo de fecha y hora nativo de MySQL, elija el DATETIME
formato nativo. Puede hacer cálculos dentro de MySQL de esa manera
("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")
y es sencillo cambiar el formato del valor a una marca de tiempo UNIX ("SELECT UNIX_TIMESTAMP(my_datetime)")
cuando consulta el registro si desea operar con PHP.
Además, a partir de MySQL 8.0.19, DATETIME
admite desplazamientos de zona horariaTIMESTAMP
, por lo que ahora hay incluso menos razones para usarlo .
En MySQL 5 y superiores, los valores TIMESTAMP se convierten de la zona horaria actual a UTC para su almacenamiento y se vuelven a convertir de UTC a la zona horaria actual para su recuperación. (Esto ocurre sólo para el tipo de datos TIMESTAMP y no para otros tipos como DATETIME).
De forma predeterminada, la zona horaria actual para cada conexión es la hora del servidor. La zona horaria se puede configurar por conexión, como se describe en Soporte de zona horaria del servidor MySQL .
Siempre uso campos DATETIME para cualquier cosa que no sean metadatos de fila (fecha de creación o modificación).
Como se menciona en la documentación de MySQL:
El tipo DATETIME se utiliza cuando necesita valores que contengan información de fecha y hora. MySQL recupera y muestra valores DATETIME en formato 'AAAA-MM-DD HH:MM:SS'. El rango admitido es '1000-01-01 00:00:00' a '9999-12-31 23:59:59'.
...
El tipo de datos TIMESTAMP tiene un rango de '1970-01-01 00:00:01' UTC a '2038-01-09 03:14:07' UTC. Tiene diferentes propiedades, según la versión de MySQL y el modo SQL en el que se ejecuta el servidor.
Es muy probable que alcance el límite inferior de TIMESTAMP en uso general, por ejemplo, almacenar la fecha de nacimiento.
Los siguientes ejemplos muestran cómo el TIMESTAMP
tipo de fecha cambió los valores después de cambiar el time-zone to 'america/new_york'
dónde DATETIME
no se modifica.
mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name | Value |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone | Asia/Calcutta |
+------------------+---------------------+
mysql> create table datedemo(
-> mydatetime datetime,
-> mytimestamp timestamp
-> );
mysql> insert into datedemo values ((now()),(now()));
mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime | mytimestamp |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+
mysql> set time_zone="america/new_york";
mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime | mytimestamp |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+
He convertido mi respuesta en un artículo para que más personas puedan encontrarlo útil, MySQL: tipos de datos de fecha, hora y marca de tiempo .