MySQL UTC-Zeit als Standardzeitstempel festlegen

35

Wie lege ich eine Zeitstempelspalte fest, deren Standardwert die aktuelle UTC-Zeit ist?

MySQL verwendet die UTC_TIMESTAMP()Funktion für den UTC-Zeitstempel:

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

Also habe ich versucht:

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

Und andere Variationen mögen UTC_TIMESTAMP(), aber ohne Erfolg.

Adam Matan
quelle
Hast du es versucht CURRENT_TIMESTAMP?
Ypercubeᵀᴹ
1
Es funktioniert, aber es speichert keinen lokalen Zeitzonenwert anstelle von UTC.
Adam Matan
Was genau willst du machen? In der Tabellenspalte den UTC-Zeitstempel speichern? Oder etwas anderes?
Ypercubeᵀᴹ
8
Aus den Typen DATE, DATETIME und 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
Beachten Sie, dass die Speicherung als UTC nur für den TIMESTAMP-Datentyp gilt, nicht für DATE und DATETIME (obwohl Sie die Standardeinstellung auf festlegen können CURRENT_TIMESTAMP). Aus der gleichen Dokumentationsseite: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Antworten:

49

Um den CURRENT_TIMESTAMPals UTC gespeicherten, aber als aktuelle Zeitzone abgerufenen Kommentar von @ ypercube zu ergänzen , können Sie die Zeitzoneneinstellung Ihres Servers mit der Option --default_time_zone für den Abruf beeinflussen. Auf diese Weise können Sie immer in UTC abrufen.

Standardmäßig ist die Option 'SYSTEM'. Dies ist die Einstellung Ihrer Systemzeitzone (die UTC sein kann oder nicht!):

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)

Sie können dies dynamisch einstellen:

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)

Oder dauerhaft in deiner my.cnf:

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

Starten Sie Ihren Server neu und Sie werden die Änderung sehen:

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
quelle
2
Sehr hilfreicher Beitrag !!
om39a
Ist es möglich, default_time_zonefür eine bestimmte Tabelle oder Datenbank anzugeben ? Vielen Dank.
WM
2
Ist es möglich, default_time_zone für eine bestimmte Abfrage anzugeben?
mcmillab
@mcmillab Sie können die Sitzungszeitzone vor dem Ausführen der Abfrage festlegen und dann auf die globale Zeitzone zurücksetzen, bevor Sie weitere Abfragen ausführen (oder die Verbindung wiederherstellen).
Derek Downey
Auf mcmillab folgen - oder die Spalte mit einem Operator abfragen, der den zugrunde liegenden UTC-Wert anzeigt (da die Konvertierung nicht 1-zu-1 ist)?
Marc L.
4

Sie können nicht UTC_TIMESTAMPals Standard festlegen, dass automatische Eigenschaften angegeben werden. Sie sollten nur DEFAULT CURRENT_TIMESTAMPund ON UPDATE CURRENT_TIMESTAMPKlauseln verwenden.

Sie können auch UTC_TIMESTAMPWerte wie diese für eine Tabelle einfügen :

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

Die INSERT-Abfrage würde folgendermaßen aussehen, um UTC_TImeSTAMP einzufügen:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
Mahesh Patil
quelle
Vielen Dank für "Sie können UTC_TIMESTAMP nicht als Standard angeben, um automatische Eigenschaften anzugeben"
Barbaros Alp
4

Meine Lösung ist mit einem Auslöser:

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

Dann hat jede neu eingefügte Zeile den Zeitstempel in UTC.

Alqin
quelle
1

für mariadb funktionierten nur die globalen my.cnf-lösungen

für mariadb 10.2 die dauerhafte lösung von @Derek Downey in diesem post.

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

Für Mariadb 10.0 (ich hatte 10.0.32), siehe https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

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

beide definitionen können in my.cnf von mariadb 10.2 koexistieren, aber ich habe mariadb 10.0 nicht mehr.

hoffe das wird dir helfen.

Alex Bodnaru
quelle