Tipos de datos MySQL Datetime Versus Timestamp

Los tipos de datos temporales en MySQL pueden ser confusos. Con suerte, este ejemplo y la discusión ayudarán a explicar las diferencias en los tipos de datos de fecha y hora.

De la referencia de MySQL:

El tipo DATETIME se usa para valores que contienen partes de fecha y hora. MySQL recupera y muestra los valores de DATETIME en el formato 'YYYY-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 se usa para valores que contienen partes de fecha y hora. TIMESTAMP tiene un rango de '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC.

Una diferencia importante entre estos dos tipos de datos es que los valores del tipo de datos TIMESTAMP se convierten de la zona horaria actual a UTC para fines de almacenamiento y se convierten de nuevo de UTC a la zona horaria actual cuando se usan. Los valores del tipo de datos de fecha y hora no se han modificado en relación con la zona horaria.

Este ejemplo es un buen ejercicio para demostrar la diferencia entre estos dos tipos de datos.

mysql> muestra variables como '% time_zone%'; + ------------------ + --------------------- + | Nombre de variable | Valor | + ------------------ + --------------------- + | system_time_zone | Hora estándar de la India | | time_zone | Asia / Calcuta | + ------------------ + --------------------- + 2 filas en conjunto (0.00 seg)


Puedes ver nuestra información de zona horaria actual. En este entorno, creemos una tabla con los dos tipos de datos y la rellenemos con la misma información temporal.

crear la tabla dateemo (mydatetime datetime, mytimestamp timestamp); Consulta OK, 0 filas afectadas (0.05 seg)
insertar en los valores de dateemo ((ahora ()), (ahora ())); Consulta OK, 1 fila afectada (0.02 seg)
seleccione * desde dateso; + --------------------- + --------------------- + | mydatetime | mytimestamp | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 14:11:09 | + --------------------- + --------------------- + 1 fila en conjunto ( 0.00 seg)


En este punto, los tipos de datos datetime y timestamp han seguido siendo los mismos valores exactos. Cambiemos la zona horaria veamos los resultados.

SET TIME_ZONE = "america / new_york"; Consulta OK, 0 filas afectadas (0.00 seg)
 seleccione * desde dateso; + --------------------- + --------------------- + | mydatetime | mytimestamp | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 04:41:09 | + --------------------- + --------------------- + 1 fila en conjunto ( 0.00 seg)


El ejemplo anterior muestra cómo el tipo de fecha TIMESTAMP cambió los valores después de cambiar la zona horaria a 'america / new_work' donde DATETIME no se modifica.