wake-up-neo.net

Wie erhalte ich die aktuelle Zeitzone von MySQL?

Weiß jemand, ob es eine solche Funktion in MySQL gibt?

UPDATE

Es werden keine gültigen Informationen ausgegeben:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Oder vielleicht kann MySQL selbst nicht genau den verwendeten time_zone kennen, das ist in Ordnung, wir können hier PHP verwenden, solange ich gültige Informationen nicht wie SYSTEM... erhalten kann.

162
user198729

Aus dem Handbuch ( Abschnitt 9.6 ):

Die aktuellen Werte der globalen und clientspezifischen Zeitzonen können wie folgt abgerufen werden:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Edit Das obige gibt SYSTEM zurück, wenn MySQL auf Slave-Zeitzone des Systems eingestellt ist, was weniger hilfreich ist. Wenn Sie PHP verwenden und die Antwort von MySQL SYSTEM ist, können Sie das System danach fragen, welche Zeitzone es über date_default_timezone_get verwendet wird. (Natürlich kann VolkerK darauf hinweisen, dass PHP möglicherweise auf einem anderen Server ausgeführt wird. Wenn jedoch angenommen wird, dass der Webserver und der DB-Server mit ihm in Verbindung stehen, ist auf gesetzt [wenn nicht tatsächlich in] die gleiche Zeitzone ist kein großer -Sprung.) Beachten Sie jedoch, dass Sie (wie bei MySQL) die Zeitzone einstellen können, die PHP verwendet ( date_default_timezone_set ) bedeutet, dass ein anderer Wert gemeldet werden kann, als das Betriebssystem verwendet. Wenn Sie die Kontrolle über den PHP - Code haben, sollten Sie wissen, ob Sie das tun, und in Ordnung sein.

Die ganze Frage, in welcher Zeitzone der MySQL-Server verwendet wird, kann jedoch eine Tangente sein, denn wenn Sie nach dem Server fragen, in welcher Zeitzone er sich befindet, erfahren Sie absolut nichts über die Daten in der Datenbank. Lesen Sie weiter für Details:

Weitere Diskussion:

Wenn Sie die Kontrolle über den Server haben, können Sie natürlich sicherstellen, dass die Zeitzone eine bekannte Größe ist. Wenn Sie nicht die Kontrolle über den Server haben, können Sie die von Ihrer Verbindung verwendete Zeitzone folgendermaßen einstellen:

set time_zone = '+00:00';

Dadurch wird die Zeitzone auf GMT gesetzt, sodass alle weiteren Vorgänge (wie now()) GMT verwenden.

Beachten Sie jedoch, dass Zeit- und Datumswerte nicht mit Zeitzoneninformationen in MySQL gespeichert werden:

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

Das Wissen um die Zeitzone des Servers ist daher nur für Funktionen wichtig, die jetzt die Zeit bringen, z. B. now(), unix_timestamp() usw .; Es sagt Ihnen nichts darüber aus, in welcher Zeitzone die Daten in den Datenbankdaten verwendet werden. Sie können annehmen, dass sie unter Verwendung der Zeitzone des Servers geschrieben wurden. Diese Annahme kann jedoch fehlerhaft sein. Um die Zeitzone aller in den Daten gespeicherten Datums- oder Zeitangaben zu kennen, müssen Sie sicherstellen, dass sie mit Zeitzoneninformationen gespeichert sind oder (wie ich es tun), dass sie immer in GMT sind.

Warum wird davon ausgegangen, dass die Daten unter Verwendung der Zeitzone des Servers fehlerhaft geschrieben wurden? Nun, zum einen wurden die Daten möglicherweise mit einer Verbindung geschrieben, die eine andere Zeitzone festlegt. Die Datenbank wurde möglicherweise von einem Server zu einem anderen verschoben, wo sich die Server in unterschiedlichen Zeitzonen befanden (ich habe mich darauf geirrt, als ich eine Datenbank geerbt habe, die von Texas nach Kalifornien umgezogen war). Aber auch wenn die Daten werden mit ihrer aktuellen Zeitzone auf dem Server geschrieben, sie sind jedoch immer noch nicht eindeutig. Im vergangenen Jahr wurde in den Vereinigten Staaten die Sommerzeit am 1. November um 14:00 Uhr deaktiviert. Angenommen, mein Server befindet sich in Kalifornien und verwendet die pazifische Zeitzone, und ich habe den Wert 2009-11-01 01:30:00 in der Datenbank. Wann war es? War dies am 1. November um 1:30 Uhr PDT oder um 1:30 Uhr am 1. November PST (eine Stunde später)? Du hast absolut keine Möglichkeit zu wissen. Moralisch: Speichern Sie Datums-/Uhrzeitangaben immer in GMT (ohne DST) und konvertieren Sie sie gegebenenfalls in die gewünschte Zeitzone.

191
T.J. Crowder

Die folgende Abfrage gibt die Zeitzone der aktuellen Sitzung zurück.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
161
JohnZ

Einfach SELECT @@system_time_zone;

Gibt PST zurück (oder was auch immer für Ihr System relevant ist).

Wenn Sie versuchen, die Sitzungszeitzone zu bestimmen, können Sie diese Abfrage verwenden:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Damit wird die Sitzungszeitzone zurückgegeben, wenn sie von der Systemzeitzone abweicht.

84
Andrew

Als Jakub Vrána (Der Ersteller oder Adminer und NotORM ) erwähnt in den Kommentaren, um den aktuellen Zeitzonenversatz in TIME auszuwählen, verwenden Sie:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Es wird Folgendes zurückgegeben: 02:00:00, wenn Ihre Zeitzone für dieses Datum +2: 00 ist

Ich habe hier ein Cheatsheet erstellt: Sollte die Zeitzone von MySQL auf UTC eingestellt sein?

51
Timo Huovinen
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Dadurch wird die Zeitzone als Ganzzahl zurückgegeben (z. B. -6), wobei positive oder negative Zeiten behandelt werden (hier kommt EXTRACT ins Spiel: HOUR-Funktion allein liefert negative Zeitzonen als positiv).

6
Black Shell

Um die aktuelle Zeitzone von MySQL zu erhalten, können Sie folgende Aktionen ausführen:

  1. SELECT @@ system_time_zone; // Hiermit können Sie die Systemzeitzone abrufen 
  2. SELECT IF (@@ session.time_zone = 'SYSTEM', @@ system_time_zone, @@ session.time_zone) // Dies gibt Ihnen die Zeitzone, wenn sich die Zeitzone des Systems von der globalen Zeitzone unterscheidet

Wenn Sie nun die mysql-Zeitzone ändern möchten, gehen Sie wie folgt vor: 1. SET GLOBAL time_zone = '+00: 00' // Dies setzt die Mysql-Zeitzone in UTC 2. SET @@ session.time_zone = "+00: 00"; // Dadurch können Sie die Zeitzone nur für Ihre bestimmte Sitzung festlegen 

5

wählen Sie sec_to_time (TIME_TO_SEC (curtime ()) + 48000); Hier können Sie Ihre Zeitunterschiede als sec angeben

2
Bala Kayan

Check out MySQL Server-Zeitzonenunterstützung und die Systemvariable system_time_zone . Hilft das?

2
Pekka 웃

Die Erwähnung des Befehls in der Beschreibung gibt "SYSTEM" zurück, wodurch angegeben wird, dass die Zeitzone des Servers benötigt wird. Welches ist für unsere Abfrage nicht nützlich.

Die folgende Abfrage hilft, die Zeitzone zu verstehen

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

Die obige Abfrage gibt Ihnen das Zeitintervall in Bezug auf die koordinierte Weltzeit (UTC). So können Sie die Zeitzone einfach analysieren. Wenn die Datenbankzeitzone IST ist, wird 5:30 ausgegeben 

UTC_TIMESTAMP

In MySQL gibt UTC_TIMESTAMP das aktuelle UTC-Datum und die Uhrzeit als Wert im Format 'YYYY-MM-DD HH: MM: SS' oder YYYYMMDDHHMMSS.uuuuuu zurück, abhängig von der Verwendung der Funktion, d. H. In einem String- oder numerischen Kontext.

JETZT()

JETZT () Funktion. MySQL NOW () gibt den Wert des aktuellen Datums und der Uhrzeit im Format 'JJJJ-MM-TT HH: MM: SS' oder im Format JJJJJMMTTHMMSS.uuuuuu abhängig vom Kontext (numerisch oder Zeichenfolge) der Funktion zurück. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () sind Synonyme von NOW ().

1
Amitesh

Mein PHP Framework verwendet

SET LOCAL time_zone='Whatever'

on after connect, wobei "Whatever" == date_default_timezone_get () ist

Nicht meine Lösung, aber dies stellt sicher, dass die SYSTEM-Zeitzone des MySQL-Servers immer dieselbe ist wie die von PHP

Ja, PHP ist stark involviert und kann sich darauf auswirken

1
vladkras

Fügen Sie einen Dummy-Datensatz in eine Ihrer Datenbanken ein, der über einen Zeitstempel verfügt. Wählen Sie diesen Datensatz aus, und rufen Sie den Wert des Zeitstempels auf. Löschen Sie diesen Datensatz. Ermittelt mit Sicherheit die Zeitzone, die der Server zum Schreiben von Daten verwendet, und ignoriert PHP -Zeitzonen.

0
alee

Sie müssen nur mysqld neu starten, nachdem Sie die Zeitzone von System geändert haben.

Die globale Zeitzone von MySQL nimmt die Zeitzone von System ein. Wenn Sie ein solches Attribut des Systems ändern, benötigen Sie lediglich einen Neustart von Mysqld.

0
Storm Young

Verwenden Sie LPAD (TIME_FORMAT (TIMEDIFF (NOW (), UTC_TIMESTAMP),% H:% i), 6, +, um einen Wert im MySQL-Zeitzonenformat zu erhalten, den Sie bequem mit CONVERT_TZ () verwenden können. Beachten Sie, dass der Zeitzonen-Versatz, den Sie erhalten, nur zu dem Zeitpunkt gültig ist, an dem der Ausdruck ausgewertet wird, da sich der Versatz mit der Zeit ändern kann, wenn Sie Sommerzeit haben. Der Ausdruck ist jedoch in Verbindung mit NOW () nützlich, um den Versatz mit der Ortszeit zu speichern, wodurch die Ergebnisse von NOW () eindeutig bestimmt werden. (In DST-Zeitzonen springt NOW () einmal pro Jahr um eine Stunde zurück, hat also einige doppelte Werte für verschiedene Zeitpunkte).

0
rtc

Um die aktuelle Uhrzeit gemäß Ihrer Zeitzone abzurufen, können Sie Folgendes verwenden (in meinem Fall "+5: 30").

wählen Sie DATE_FORMAT (convert_tz (now (), @@ session.time_zone, '+ 05:30'), '% Y-% m-% d').

0
Sanjoy Kanrar