MySQL Définir l'heure UTC comme horodatage par défaut


35

Comment définir une colonne d'horodatage dont la valeur par défaut est l'heure UTC actuelle?

MySQL utilise la UTC_TIMESTAMP()fonction d'horodatage UTC:

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

Alors j'ai essayé:

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

Et d'autres variations, comme UTC_TIMESTAMP(), mais sans succès.


Avez-vous essayé CURRENT_TIMESTAMP?
Ypercubeᵀᴹ

1
Cela fonctionne, mais il ne stocke pas la valeur du fuseau horaire local au lieu de l'heure UTC.
Adam Matan

Que veux-tu faire exactement? Stocker dans la colonne de table le timestamp UTC? Ou autre chose?
Ypercubeᵀᴹ

8
A partir de la date, DATETIME et types 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
Sachez que le stockage au format UTC s'applique uniquement au type de données TIMESTAMP, et non à DATE et DATETIME (bien que vous puissiez définir leur valeur par défaut CURRENT_TIMESTAMP). De la même page de la documentation: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Réponses:


49

Pour aller avec le commentaire de @ ypercube qui CURRENT_TIMESTAMPest stocké au format UTC mais récupéré comme fuseau horaire actuel, vous pouvez affecter le réglage du fuseau horaire de votre serveur avec l' option --default_time_zone pour la récupération. Cela permet à votre récupération d'être toujours en UTC.

Par défaut, l'option "SYSTÈME" définit comment définir le fuseau horaire de votre système (qui peut ou non correspondre à l'heure 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)

Vous pouvez définir ceci dynamiquement:

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 en permanence dans votre my.cnf:

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

Redémarrez votre serveur et vous verrez le changement:

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 très utile !!
Om39a

Est-il possible de spécifier default_time_zonepour une table ou une base de données spécifique? Merci.
WM

2
Est-il possible de spécifier default_time_zone pour une requête spécifique?
mcmillab

@mcmillab vous pouvez définir le fuseau horaire de la session avant d'exécuter la requête, puis rétablir le fuseau horaire global avant d'exécuter d'autres requêtes (ou de vous reconnecter).
Derek Downey

Suivre mcmillab - ou interroger la colonne avec un opérateur indiquant la valeur UTC sous-jacente (la conversion n’étant pas de 1 à 1)?
Marc L.

4

Vous ne pouvez pas spécifier UTC_TIMESTAMPpar défaut de spécifier les propriétés automatiques. Utilisez uniquement les clauses DEFAULT CURRENT_TIMESTAMPet ON UPDATE CURRENT_TIMESTAMP.

Vous pouvez aussi INSERER des UTC_TIMESTAMPvaleurs comme celle-ci pour une table:

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

La requête INSERT ressemblerait à ceci pour insérer UTC_TImeSTAMP:

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

Merci pour "Vous ne pouvez pas spécifier UTC_TIMESTAMP par défaut pour spécifier les propriétés automatiques"
Barbaros Alp

4

Ma solution est avec un déclencheur:

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

Ensuite, chaque nouvelle ligne insérée aura l'horodatage en UTC.


1

pour mariadb, seules les solutions globales my.cnf ont fonctionné

pour mariadb 10.2, la solution permanente de @Derek Downey dans ce billet.

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

pour mariadb 10.0 (j'avais 10.0.32), voir https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

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

les deux définitions peuvent coexister dans mon.cnf de mariadb 10.2, mais je n'ai plus mariadb 10.0.

J'espère que ceci vous aidera.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.