MySQL Establecer la hora UTC como marca de tiempo predeterminada

35

¿Cómo configuro una columna de marca de tiempo cuyo valor predeterminado es la hora UTC actual?

MySQL usa la UTC_TIMESTAMP()función para la marca de tiempo UTC:

mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)

Entonces he intentado:

CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...

Y otras variaciones, como UTC_TIMESTAMP(), pero sin éxito.

Adam Matan
fuente
¿Lo intentaste CURRENT_TIMESTAMP?
ypercubeᵀᴹ 01 de
1
Funciona, pero no almacena el valor de zona horaria local en lugar de UTC.
Adam Matan
¿Qué es exactamente lo que quiere hacer? ¿Almacenar en la columna de la tabla la marca de tiempo UTC? ¿O algo mas?
ypercubeᵀᴹ 01 de
8
De los tipos DATE, DATETIME y TIMESTAMP :MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
ypercubeᵀᴹ
3
Tenga en cuenta que el almacenamiento como UTC solo se aplica al tipo de datos TIMESTAMP, no a DATE y DATETIME (aunque puede establecer su valor predeterminado en CURRENT_TIMESTAMP). De la misma página de documentación: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Respuestas:

49

Para seguir el comentario de @ypercube que CURRENT_TIMESTAMPse almacena como UTC pero se recupera como la zona horaria actual, puede afectar la configuración de la zona horaria de su servidor con la opción --default_time_zone para la recuperación. Esto permite que su recuperación esté siempre en UTC.

Por defecto, la opción es 'SISTEMA', que es cómo se configura la zona horaria de su sistema (¡que puede o no ser UTC!):

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)

Puede configurar esto dinámicamente:

mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

O permanentemente en tu my.cnf:

[mysqld]
**other variables**
default_time_zone='+00:00'

Reinicie su servidor, y verá el cambio:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
Derek Downey
fuente
2
Muy útil post !!
om39a
¿Es posible especificar default_time_zoneuna tabla o base de datos específica? Gracias.
WM
2
¿Es posible especificar default_time_zone para una consulta específica?
mcmillab
@mcmillab puede configurar la zona horaria de la sesión antes de ejecutar la consulta, luego restablecer a la zona horaria global antes de ejecutar más consultas (o volver a conectar).
Derek Downey
Siguiendo en mcmillab, ¿o para consultar la columna con un operador que muestra el valor UTC subyacente (ya que la conversión no es 1 a 1)?
Marc L.
4

No puede especificar de UTC_TIMESTAMPforma predeterminada para especificar propiedades automáticas. Debe usar solo DEFAULT CURRENT_TIMESTAMPy ON UPDATE CURRENT_TIMESTAMPcláusulas.

También puede INSERTAR UTC_TIMESTAMPvalores como este para una tabla:

CREATE TABLE `test` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

La consulta INSERT sería así para insertar UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
Mahesh Patil
fuente
Gracias por "No puede especificar UTC_TIMESTAMP por defecto para especificar propiedades automáticas"
Barbaros Alp
4

Mi solución es con un disparador:

DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;

Luego, cada nueva fila insertada tendrá la marca de tiempo en UTC.

Alqin
fuente
1

para mariadb solo las soluciones globales my.cnf funcionaron

para mariadb 10.2, la solución permanente de @Derek Downey en esta publicación.

[mysqld]
**other variables**
default_time_zone='+00:00'

para mariadb 10.0 (tenía 10.0.32), consulte https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

[mysqld_safe]
**other variables**
timezone = UTC

ambas definiciones pueden coexistir en my.cnf de mariadb 10.2, pero ya no tengo mariadb 10.0.

Espero que esto te ayudará.

Alex Bodnaru
fuente