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

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

UPDATE

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

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

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

Ответ 1

Из руководства (раздел 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.

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

Ответ 2

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

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

Ответ 3

Просто SELECT @@system_time_zone;

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

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

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

Ответ 5

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

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

Ответ 6

Чтобы получить текущий часовой пояс mysql, вы можете делать следующие вещи:

  • SELECT @@system_time_zone;//из этого вы можете получить системный часовой пояс
  • 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";//этим вы можете синхронизировать часовой пояс только для своего конкретного сеанса.

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

SET LOCAL time_zone='Whatever'

on после подключения, где 'Whatever' == date_default_timezone_get()

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

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

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

as is whole mysql

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

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

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

если вы попробуете dateiff, date_sub или timediff с помощью now() и utc_time(), вы, вероятно, столкнетесь с проблемами конверсии, которые тихо посещаются сервером.

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

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

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