Weiß jemand, ob es in MySQL eine solche Funktion gibt?
AKTUALISIEREN
Dies gibt keine gültigen Informationen aus:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
Oder vielleicht kann MySQL selbst nicht genau wissen, was time_zone
verwendet wird, das ist in Ordnung, wir können PHP
hier einbeziehen , solange ich gültige Informationen erhalten kann, die nicht wie SYSTEM
...
@@system_time_zone
wie in meiner Antwort unten angegeben.Antworten:
Aus dem Handbuch ( Abschnitt 9.6 ):
Bearbeiten Das Obige wird zurückgegeben,
SYSTEM
wenn MySQL so eingestellt ist, dass es der Zeitzone des Systems entspricht, was weniger hilfreich ist. Da Sie PHP verwenden und die Antwort von MySQL lautetSYSTEM
, können Sie das System fragen, über welche Zeitzone es verwendetdate_default_timezone_get
. (Natürlich, wie VolkerK hervorhob, läuft PHP möglicherweise auf einem anderen Server, aber unter den Voraussetzungen wird davon ausgegangen, dass der Webserver und der DB-Server, mit dem er spricht, auf [wenn nicht tatsächlich in ] derselben Zeitzone eingestellt sind, keine großer Sprung.) Aber Vorsicht, dass Sie (wie bei MySQL) die Zeitzone einstellen können, die PHP verwendet (date_default_timezone_set
), was bedeutet, dass möglicherweise ein anderer Wert gemeldet wird als vom 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, welche Zeitzone der MySQL-Server verwendet, kann jedoch eine Tangente sein, da die Frage, in welcher Zeitzone er sich befindet, absolut nichts über die Daten in der Datenbank aussagt. 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 :
Dadurch wird die Zeitzone auf GMT gesetzt, sodass bei weiteren Vorgängen (wie z. B.
now()
) GMT verwendet wird.Beachten Sie jedoch, dass Zeit- und Datumswerte nicht mit Zeitzoneninformationen in MySQL gespeichert werden:
So wissen die Zeitzone des Servers ist nur wichtig , in Bezug auf die Funktionen, die die Zeit jetzt, wie erhalten
now()
,unix_timestamp()
usw .; Es sagt nichts darüber aus, welche Zeitzone die Daten in den Datenbankdaten verwenden. Sie können davon ausgehen, dass sie in der Zeitzone des Servers geschrieben wurden, aber diese Annahme ist möglicherweise fehlerhaft. Um die Zeitzone von Daten oder Zeiten zu kennen, die in den Daten gespeichert sind, müssen Sie sicherstellen, dass sie mit Zeitzoneninformationen gespeichert sind oder (wie ich) sicherstellen, dass sie immer in GMT sind.Warum ist die Annahme, dass die Daten mit der Zeitzone des Servers geschrieben wurden, fehlerhaft? Zum einen wurden die Daten möglicherweise über eine Verbindung geschrieben, die eine andere Zeitzone festlegt. Die Datenbank wurde möglicherweise von einem Server auf einen anderen verschoben, wobei sich die Server in unterschiedlichen Zeitzonen befanden (ich bin darauf gestoßen, als ich eine Datenbank geerbt habe, die von Texas nach Kalifornien verschoben wurde). Aber selbst wenn die Daten mit ihrer aktuellen Zeitzone auf den Server geschrieben werden, sind sie immer noch nicht eindeutig. Letztes Jahr wurde in den USA die Sommerzeit am 1. November um 2:00 Uhr morgens ausgeschaltet. Angenommen, mein Server befindet sich in Kalifornien und verwendet die pazifische Zeitzone. Ich habe den Wert
2009-11-01 01:30:00
in der Datenbank. Wann war es? War das 1:30 Uhr am 1. November PDT oder 1:30 Uhr am 1. November PST (eine Stunde später)? Sie haben absolut keine Möglichkeit zu wissen. Moral: Speichern Sie Datums- und Uhrzeitangaben immer in GMT (ohne Sommerzeit) und konvertieren Sie sie bei Bedarf in die gewünschte Zeitzone.quelle
DATETIME
Typ enthält keine Zeitzoneninformationen. Daher denke ich, dass die beabsichtigte zugrunde liegende Philosophie hier darin besteht, dass mySQL so zeitzonenblind wie möglich ist - was bedeutet, dass der Benutzer bei einer Zeitzone bleibt, entweder UTC oder der Zeitzone, in der sich der Server befindet, alles in dieser Zone speichert und Konvertierungen auf Anwendungsebene oder mitCONVERT_TZ()
( dev.mysql.com/doc/refman/5.0/en/… ) durchführen. Zumindest habe ich so immer verstanden, wie es funktionieren soll, wenn ich mir die spärlichen Optionen angesehen habe, die mySQL in diesem Bereich bietet.now()
in PHP?Die folgende Abfrage gibt die Zeitzone der aktuellen Sitzung zurück.
quelle
select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
ist einfacher.SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
um den Unterschied in Sekunden zu bekommen.Einfach
SELECT @@system_time_zone;
Rückgabe
PST
(oder was auch immer für Ihr System relevant ist).Wenn Sie versuchen, die Sitzungszeitzone zu bestimmen, können Sie folgende Abfrage verwenden:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
Dadurch wird die Sitzungszeitzone zurückgegeben, wenn sie von der Systemzeitzone abweicht.
quelle
Wie Jakub Vrána (Der Ersteller oder Administrator und NotORM ) in den Kommentaren erwähnt, um den aktuell verwendeten Zeitzonenversatz auszuwählen
TIME
:Es wird zurückkehren:
02:00:00
Wenn Ihre Zeitzone für dieses Datum +2: 00 istIch habe hier ein Cheatsheet erstellt: Sollte die Zeitzone von MySQL auf UTC eingestellt sein?
quelle
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
um den Unterschied in Sekunden zu bekommen.02:00:00
, das entsprechende TIMESTAMPDIFF zurückkehren,-2
wenn die Einheit HOUR ist,-120
wenn die Einheit MINUTE ist usw. Um das Vorzeichen zu erhalten, das der Zeitzone entspricht, tauschen Sie die Parameter aus: GibtSELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())
die erwartete120
Zeitzone zurück +2: 00. Der Grund für die Angabe von Minuten ist, dass es einige Zeitzonen gibt, die 30 oder 45 Minuten versetzt sind, siehe en.wikipedia.org/wiki/Time_zoneUm die aktuelle Zeitzone des MySQL zu erhalten, können Sie folgende Schritte ausführen:
Wenn Sie nun die MySQL-Zeitzone ändern möchten, dann:
quelle
Dadurch wird die Zeitzone als Ganzzahl (z. B. :) zurückgegeben
-6
, wobei positive oder negative Zeiten behandelt werden (hier kommt derEXTRACT
Punkt ins Spiel: DieHOUR
Funktion allein gibt negative Zeitzonen als positiv zurück).quelle
Zu jedem kommen, um Zeitzone von MySQL DB zu finden.
Mit dieser Abfrage können Sie die aktuelle Zeitzone abrufen:
quelle
Der in der Beschreibung erwähnte Befehl gibt "SYSTEM" zurück, was angibt, dass die Zeitzone des Servers benötigt wird. Was für unsere Anfrage nicht nützlich ist.
Die folgende Abfrage hilft beim Verständnis der Zeitzone
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 aktuelle UTC-Uhrzeit als Wert im Format 'JJJJ-MM-TT HH: MM: SS' oder JJJJMMTTHHMMSS.uuuuuu zurück, abhängig von der Verwendung der Funktion, dh in einer Zeichenfolge oder einem numerischen Kontext.
JETZT()
JETZT () Funktion. MySQL NOW () gibt den Wert des aktuellen Datums und der aktuellen Uhrzeit im Format 'JJJJ-MM-TT HH: MM: SS' oder im Format JJJJMMTTHHMMSS.uuuuuu zurück, je nach Kontext (numerisch oder Zeichenfolge) der Funktion. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () sind Synonyme für NOW ().
quelle
Überprüfen Sie die MySQL Server-Zeitzonenunterstützung und die
system_time_zone
Systemvariable. Hilft das?quelle
Mein PHP-Framework verwendet
Ein nach dem Verbinden, wobei 'Whatever' == date_default_timezone_get ()
Nicht meine Lösung, aber das stellt sicher
SYSTEM
Zeitzone des MySQL-Servers immer dieselbe ist wie die von PHPAlso, ja, PHP ist stark involviert und kann es beeinflussen
quelle
Um die aktuelle Zeit gemäß Ihrer Zeitzone zu erhalten, können Sie Folgendes verwenden (in meinem Fall '+5: 30')
quelle
Sie müssen mysqld nur neu starten, nachdem Sie die Zeitzone des Systems geändert haben.
Die globale Zeitzone von MySQL benötigt die Zeitzone von System. Wenn Sie ein solches Systemattribut ändern, benötigen Sie lediglich einen Neustart von Mysqld.
quelle
Fügen Sie einen Dummy-Datensatz in eine Ihrer Datenbanken mit einem Zeitstempel ein. Wählen Sie diesen Datensatz aus und erhalten Sie den Wert des Zeitstempels. Löschen Sie diesen Datensatz. Ruft mit Sicherheit die Zeitzone ab, die der Server zum Schreiben von Daten verwendet, und ignoriert PHP-Zeitzonen.
quelle
Sie können Folgendes versuchen:
Hier können Sie Ihren Zeitunterschied als Sekunden angeben
quelle
Verwenden
LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')
Sie diese Option, um einen Wert im Zeitzonenformat von MySQL abzurufen, mit dem Sie bequem arbeiten könnenCONVERT_TZ()
. Beachten Sie, dass der Zeitzonenversatz, den Sie erhalten, nur zu dem Zeitpunkt gültig ist, zu dem der Ausdruck ausgewertet wird, da sich der Versatz im Laufe der Zeit ändern kann, wenn Sie Sommerzeit haben. Der Ausdruck ist jedoch nützlichNOW()
, um den Versatz mit der Ortszeit zu speichern, wodurch eindeutig wird, welcheNOW()
Ausbeuten erzielt werden. (Springt in DST-ZeitzonenNOW()
einmal im Jahr eine Stunde zurück und weist daher einige doppelte Werte für bestimmte Zeitpunkte auf.)quelle
Es kann sein
Auf diese Weise erhalten Sie den Zeitzonenwert nicht direkt.
@@global.time_zone
kann nicht verwendet werden, da es sich um eine Variable handelt und den Wert zurückgibt'SYSTEM'
.Wenn Sie Ihre Abfrage in einer Sitzung mit einer geänderten Zeitzone verwenden müssen
session SET TIME_ZONE =
, erhalten Sie diese mit@@session.time_zone
. Wenn Sie abfragen@@global.time_zone
, erhalten Sie'SYSTEM'
.Wenn Sie es
datediff
mitdate_sub
odertimediff
mitnow()
und versuchen , werdenutc_time()
Sie wahrscheinlich auf Konvertierungsprobleme stoßen.Aber die oben vorgeschlagenen Dinge werden wahrscheinlich zumindest mit einigen Serverversionen funktionieren. Meine Version ist 5.5.43-37 und ist eine gehostete Lösung.
quelle
Versuchen Sie es mit dem folgenden Code:
quelle