MySQL Definir hora UTC como carimbo de data e hora padrão

35

Como defino uma coluna de carimbo de data / hora cujo valor padrão é o horário UTC atual?

O MySQL usa a UTC_TIMESTAMP()função para o carimbo de data / hora UTC:

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

Então eu tentei:

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

E outras variações, como UTC_TIMESTAMP(), mas sem sucesso.

Adam Matan
fonte
Você tentou CURRENT_TIMESTAMP?
precisa saber é o seguinte
1
Funciona, mas não armazena o valor de um fuso horário local em vez do UTC.
Adam Matan
O que exatamente você quer fazer? Armazenar na coluna da tabela o carimbo de data / hora UTC? Ou alguma outra coisa?
precisa saber é o seguinte
8
A partir da data, DATETIME e Tipos 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
Esteja ciente de que o armazenamento como UTC se aplica apenas ao tipo de dados TIMESTAMP, não a DATE e DATETIME (embora você possa definir o padrão para CURRENT_TIMESTAMP). A partir da mesma página de documentação: (This does not occur for other types such as DATETIME.).
AronVanAmmers 02/03

Respostas:

49

Para acompanhar o comentário do @ ypercube que CURRENT_TIMESTAMPé armazenado como UTC, mas recuperado como o fuso horário atual, você pode afetar a configuração de fuso horário do servidor com a opção --default_time_zone para recuperação. Isso permite que sua recuperação esteja sempre no UTC.

Por padrão, a opção é 'SYSTEM', que é como o fuso horário do sistema é definido (que pode ou não 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)

Você pode definir isso dinamicamente:

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)

Ou permanentemente no seu my.cnf:

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

Reinicie seu servidor e você verá a alteração:

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
fonte
2
Post muito útil !!
precisa saber é
É possível especificar default_time_zonepara uma tabela ou banco de dados específico? Obrigado.
WM
2
É possível especificar default_time_zone para uma consulta específica?
mcmillab
@mcmillab, você pode definir o fuso horário da sessão antes de executar a consulta e redefinir o fuso horário global antes de executar outras consultas (ou reconectar).
Derek Downey
Seguindo mcmillab - ou para consultar a coluna com um operador que mostre o valor UTC subjacente (já que a conversão não é 1 para 1)?
Marc L.
4

Você não pode especificar UTC_TIMESTAMPcomo padrão para especificar propriedades automáticas. Você deve usar apenas o padrão CURRENT_TIMESTAMPe as ON UPDATE CURRENT_TIMESTAMPcláusulas.

Além disso, você pode INSERIR UTC_TIMESTAMPvalores como este para uma tabela:

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

A consulta INSERT seria assim para inserir UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
Mahesh Patil
fonte
Obrigado por "Você não pode especificar UTC_TIMESTAMP como padrão para especificar propriedades automáticas"
Barbaros Alp
4

Minha solução é com um gatilho:

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

Cada nova linha inserida terá o carimbo de data e hora no UTC.

Alqin
fonte
1

para o mariadb, apenas as soluções globais my.cnf funcionaram

para o mariadb 10.2, a solução permanente de @Derek Downey neste post.

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

para mariadb 10.0 (eu tinha 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 as definições podem coexistir no my.cnf do mariadb 10.2, mas não tenho mais o mariadb 10.0.

espero que isso ajude você.

Alex Bodnaru
fonte