MySQL Imposta l'ora UTC come data / ora predefinita


35

Come posso impostare una colonna timestamp il cui valore predefinito è l'ora UTC corrente?

MySQL utilizza la UTC_TIMESTAMP()funzione per il timestamp UTC:

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

Quindi ho provato:

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

E altre varianti, come UTC_TIMESTAMP(), ma senza successo.


Ci hai provato CURRENT_TIMESTAMP?
ypercubeᵀᴹ

1
Funziona, ma non memorizza il valore di un fuso orario locale anziché UTC.
Adam Matan,

Che cosa vuoi fare esattamente? Memorizzare nella colonna della tabella il timestamp UTC? O qualcos'altro?
ypercubeᵀᴹ

8
Dai tipi DATA, DATETIME e 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
Tenere presente che l'archiviazione come UTC si applica solo al tipo di dati TIMESTAMP, non a DATE e DATETIME (sebbene sia possibile impostare il valore predefinito su CURRENT_TIMESTAMP). Dalla stessa pagina di documentazione: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Risposte:


49

Per accompagnare il commento di @ ypercube che CURRENT_TIMESTAMPviene archiviato come UTC ma recuperato come fuso orario corrente, è possibile influire sull'impostazione del fuso orario del server con l' opzione --default_time_zone per il recupero. Ciò consente al recupero di essere sempre in UTC.

Per impostazione predefinita, l'opzione è "SISTEMA", ovvero l'impostazione del fuso orario del sistema (che può essere o meno 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)

Puoi impostarlo in modo dinamico:

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 nel tuo my.cnf:

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

Riavvia il server e vedrai la modifica:

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)

2
Post molto utile !!
om39a,

È possibile specificare default_time_zoneuna tabella o un database specifici? Grazie.
WM,

2
È possibile specificare default_time_zone per una query specifica?
mcmillab,

@mcmillab è possibile impostare il fuso orario della sessione prima di eseguire la query, quindi ripristinare il fuso orario globale prima di eseguire ulteriori query (o riconnettersi).
Derek Downey,

Seguendo su mcmillab - o per interrogare la colonna con un operatore che mostra il valore UTC sottostante (poiché la conversione non è 1 a 1)?
Marc L.

4

Non è possibile specificare UTC_TIMESTAMPcome predefinito per specificare le proprietà automatiche, è necessario utilizzare solo DEFAULT CURRENT_TIMESTAMPe ON UPDATE CURRENT_TIMESTAMPclausole.

Inoltre, puoi INSERIRE UTC_TIMESTAMPvalori come questo per una tabella:

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

La query INSERT sarebbe come questa per inserire UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;

Grazie per "Non è possibile specificare UTC_TIMESTAMP come predefinito per specificare le proprietà automatiche"
Barbaros Alp

4

La mia soluzione è con un trigger:

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

Quindi ogni nuova riga inserita avrà il timestamp in UTC.


1

per mariadb funzionavano solo le soluzioni globali my.cnf

per mariadb 10.2, la soluzione permanente di @Derek Downey in questo post.

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

per mariadb 10.0 (avevo 10.0.32), vedi https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

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

entrambe le definizioni possono coesistere in my.cnf di mariadb 10.2, ma non ho più mariadb 10.0.

spero che questo ti possa aiutare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.