Как мне узнать текущий часовой пояс MySQL?

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

ОБНОВИТЬ

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

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

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

19 ответов

Решение

Из руководства ( раздел 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) и конвертируйте в желаемый часовой пояс по мере необходимости.

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

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

ПростоSELECT @@system_time_zone;

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

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

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

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

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

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

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

Чтобы получить текущий часовой пояс 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"; // этим вы можете изменить часовой пояс только для вашей конкретной сессии

Кому угодно найти часовой пояс mysql db.

С помощью этого запроса вы можете получить текущий часовой пояс:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

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

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

Упоминание команды в описании возвращает "SYSTEM", которая указала, что она использует часовой пояс сервера. Что не полезно для нашего запроса.

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

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

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

UTC_TIMESTAMP

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

СЕЙЧАС()

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

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

На основе ответа Тимоса. По крайней мере, в более старой версии mysql, если ваш текущий часовой пояс ниже, чем UTC, тогда его решение возвращаетсяNULL.

      SELECT 
    IF(NOW() >= UTC_TIMESTAMP,
        CONCAT('+', SUBSTRING_INDEX(TIMEDIFF(NOW(), UTC_TIMESTAMP), ':', 2)),
        CONCAT('-', SUBSTRING_INDEX(TIMEDIFF(UTC_TIMESTAMP, NOW()), ':', 2))
    ) AS offset;

это возвращает (в зависимости от вашего часового пояса)

      +02:00
-01:00

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

Используйте LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP), '%H:%i'),6, '+'), чтобы получить значение в формате часового пояса MySQL, которое вы можете удобно использовать с CONVERT_TZ(). Обратите внимание, что смещение часового пояса, которое вы получаете, действительно только в тот момент времени, когда вычисляется выражение, поскольку смещение может изменяться со временем, если у вас есть переход на летнее время. Тем не менее, выражение полезно вместе с NOW () для хранения смещения с местным временем, которое однозначно определяет, что дает NOW (). (В часовых поясах DST NOW () возвращается на один час назад в год, поэтому имеет несколько повторяющихся значений для разных моментов времени).

Чтобы узнать текущее время в соответствии с вашим часовым поясом, вы можете использовать следующее (в моем случае это "+5:30")

выберите DATE_FORMAT(convert_tz(now(),@@session.time_zone,'+05:30'),'%Y-%m-%d')

Это может быть так глупо, как это

выберите timediff(current_time(),utc_time())

как целое

Вы не сможете напрямую получить значение часового пояса, но если бы не было другого пути...

@@global.time_zone нельзя использовать в поле зрения, поскольку она является переменной - и она возвращает совершенно неиспользуемое значение "SYSTEM" (я не понимаю, почему кто-то возился с этим)

если вам нужно использовать ваш запрос в сеансе с измененным time_zone (по сеансу SET TIME_ZONE =), вы получите это с @@session.time_zone, если вы запросите @@global.time_zone, вы получите "SYSTEM" catch 22

если вы попробуете datediff, date_sub или timediff с now() и utc_time (), вы, вероятно, столкнетесь с проблемами конвертации, которые молча выбрасывает сервер

Худшая документация, которую я когда-либо видел, тоже мне не поможет.

Отличная работа, все!

Но что-то, предложенное выше, вероятно, будет работать, по крайней мере, с некоторыми версиями серверов, как мое решение (5.5.43-37).

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

SET LOCAL time_zone='Whatever'

на после подключения, где "Безотносительно" == date_default_timezone_get ()

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

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

Вам просто нужно перезапустить mysqld после изменения часового пояса системы.

Глобальный часовой пояс MySQL занимает часовой пояс Системы. Когда вы изменяете любой такой атрибут системы, вам просто нужно перезапустить Mysqld.

Вставьте фиктивную запись в одну из ваших баз данных с временной меткой. Выберите эту запись и получите значение временной метки. Удалить эту запись. Получает точно часовой пояс, который сервер использует для записи данных, и игнорирует часовые пояса PHP.

Это не прямой ответ на этот вопрос, но этот пост в блоге содержит ценную информацию по этому вопросу:

https://danuka-praneeth.medium.com/guide-to-time-zones-conversion-between-zones-and-storing-in-mysql-da4fc4350cd9.

Цитата из сообщения в блоге:

В MySQL5+ значения TIMESTAMP преобразуются из часового пояса сеанса в UTC для хранения и из UTC в часовой пояс сеанса для извлечения. Но DATETIME не выполняет никаких преобразований.

Попробуйте использовать следующий код:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
Другие вопросы по тегам