Как мне узнать текущий часовой пояс MySQL? - PullRequest
176 голосов
/ 29 мая 2010

Кто-нибудь знает, есть ли такая функция в MySQL?

UPDATE

Это не выводит никакой действительной информации:

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

Или, может быть, сам MySQL не может точно знать используемый time_zone, это нормально, мы можем задействовать PHP здесь, пока я могу получить действительную информацию, не такую ​​как SYSTEM ...

Ответы [ 16 ]

203 голосов
/ 29 мая 2010

Из руководства ( раздел 9.6 ):

Текущие значения глобальных и клиентских часовых поясов можно получить следующим образом:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Редактировать Вышеприведенное возвращает SYSTEM, если MySQL установлен как подчиненный для часового пояса системы, что менее чем полезно. Поскольку вы используете PHP, если ответ от MySQL - SYSTEM, вы можете спросить систему, какой часовой пояс это , используя date_default_timezone_get. (Конечно, как указал VolkerK, PHP может работать на другом сервере, но, исходя из предположений, предполагается, что для веб-сервера и сервера БД, с которыми он разговаривает, установлено на [если на самом деле в ] тот же часовой пояс не является огромным скачком.) Но учтите, что (как и в MySQL) вы можете установить часовой пояс, который использует PHP (date_default_timezone_set) , это означает, что он может сообщать значение, отличное от используемого ОС. Если вы контролируете код PHP, вы должны знать, делаете ли вы это, и все будет в порядке.

Но весь вопрос о том, какой часовой пояс использует сервер MySQL, может быть касательным, потому что, спрашивая сервер, в каком часовом поясе он находится, абсолютно ничего не о данных в базе данных. Продолжайте читать для деталей:

Дальнейшее обсуждение :

Если вы контролируете сервер, конечно, вы можете убедиться, что часовой пояс является известным количеством. Если вы не контролируете сервер, вы можете установить часовой пояс, используемый вашим соединением , следующим образом:

set time_zone = '+00:00';

Устанавливает часовой пояс в GMT, так что для любых дальнейших операций (например, now()) будет использоваться GMT.

Обратите внимание, что значения времени и даты не хранятся вместе с информацией о часовом поясе в MySQL:

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)

Таким образом, знание часового пояса сервера важно только с точки зрения функций, которые получают время прямо сейчас, таких как now(), unix_timestamp() и т. Д .; он ничего не говорит вам о том, какой часовой пояс используют даты в данных базы данных. Вы можете предположить, они были написаны с использованием часового пояса сервера, но это предположение вполне может быть ошибочным. Чтобы узнать часовой пояс любых дат или времени, хранящихся в данных, вы должны убедиться, что они хранятся вместе с информацией о часовом поясе, или (как я знаю), чтобы они всегда были в GMT.

Почему предполагается, что данные были записаны с использованием часового пояса сервера? Ну, во-первых, данные могут быть записаны с использованием соединения, которое устанавливает другой часовой пояс. База данных, возможно, была перемещена с одного сервера на другой, где серверы находились в разных часовых поясах (я столкнулся с этим, когда унаследовал базу данных, которая была перемещена из Техаса в Калифорнию). Но , даже если данные записаны на сервере с текущим часовым поясом, они все еще неоднозначны. В прошлом году в Соединенных Штатах летнее время было выключено в 2 часа ночи 1 ноября. Предположим, мой сервер находится в Калифорнии с использованием часового пояса Тихого океана, и в базе данных у меня есть значение 2009-11-01 01:30:00. Когда это было? Было ли это 1:30 ночи 1 ноября по тихоокеанскому времени или 1:30 ночи 1 ноября по тихоокеанскому времени (час спустя)? У вас нет абсолютно никакого способа узнать. Мораль: всегда храните даты / время в GMT (что не делает DST) и конвертируйте в нужный часовой пояс по мере необходимости.

172 голосов
/ 21 октября 2010

Запрос ниже возвращает часовой пояс текущего сеанса.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
82 голосов
/ 25 ноября 2011

Просто SELECT @@system_time_zone;

Возвращает PST (или все, что имеет отношение к вашей системе).

Если вы пытаетесь определить часовой пояс сеанса, вы можете использовать этот запрос:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Который вернет часовой пояс сеанса, если он отличается от системного часового пояса.

54 голосов
/ 28 сентября 2013

Как Jakub Vrána (Создатель или Администратор и NotORM ) упоминает в комментариях, чтобы выбрать текущее смещение часового пояса в TIME. 1008 *

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Будет возвращено: 02:00:00, если ваш часовой пояс на эту дату +2: 00

Я сделал шпаргалку здесь: Должен ли MySQL иметь часовой пояс с UTC?

6 голосов
/ 07 февраля 2015
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Возвращает часовой пояс в виде целого числа (например, -6), обрабатывая положительные или отрицательные моменты времени (вот когда EXTRACT вступает в игру: HOUR одна функция возвращает отрицательные часовые пояса как положительные).

5 голосов
/ 10 марта 2016

Для получения текущего часового пояса mysql вы можете сделать следующие вещи:

  1. SELECT @@ system_time_zone;// из этого вы можете получить системный часовой пояс
  2. SELECT IF (@@ session.time_zone = 'SYSTEM', @@ system_time_zone, @@ session.time_zone) // Это даст вам часовой пояс, если системный часовой поясотличается от глобального часового пояса

Теперь, если вы хотите изменить часовой пояс mysql, тогда: 1. SET GLOBAL time_zone = '+00: 00' // это установит часовой пояс mysql в UTC 2. SET @@ session.time_zone = "+00: 00";// этим вы можете изменить часовой пояс только для вашего конкретного сеанса

3 голосов
/ 29 мая 2010

Извлечение Поддержка часового пояса сервера MySQL и системная переменная system_time_zone. Это помогает?

2 голосов
/ 20 июня 2017

выберите sec_to_time (TIME_TO_SEC (curtime ()) + 48000); здесь вы можете указать разницу во времени в секундах

1 голос
/ 18 сентября 2018

Упоминание команды в описании возвращает «СИСТЕМА», которая указала, что она занимает часовой пояс сервера. Что не полезно для нашего запроса.

Следующий запрос поможет понять часовой пояс

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

Выше запрос даст вам интервал времени по отношению к всемирному координированному времени (UTC). Таким образом, вы можете легко проанализировать часовой пояс. если часовой пояс базы данных - IST, вывод будет 5:30

UTC_TIMESTAMP

В MySQL UTC_TIMESTAMP возвращает текущую дату и время UTC в виде значения в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС» или ГГГГММДДЧЧММСС.уууууу в зависимости от использования функции, т.е. в строковом или числовом контексте .

NOW ()

СЕЙЧАС () функция. MySQL NOW () возвращает значение текущей даты и времени в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС» или в формате ГГГГММДДЧЧММСС.uuuuuuu в зависимости от контекста (числового или строкового) функции. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () являются синонимами NOW ().

1 голос
/ 08 января 2016

Мой PHP-фреймворк использует

SET LOCAL time_zone='Whatever'

при подключении, где «Безотносительно» == date_default_timezone_get ()

Не мое решение, но это гарантирует SYSTEM часовой пояс сервера MySQL всегда совпадает с часовым поясом PHP

Так что да, PHP сильно вовлечен и может повлиять на него

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...