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

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

обновление

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

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

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

16 ответов


из руководства (9.6):

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

редактировать выше возвращает SYSTEM Если MySQL установлен в подчиненный часовой пояс системы, что менее чем полезно. Поскольку вы используете PHP, если ответ от MySQL SYSTEM, затем вы можете спросить систему, какой часовой пояс это через date_default_timezone_get. (Конечно, как отметил Фолькерк, 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(), etc.; он ничего не говорит вам о том, какой часовой пояс используют даты в данных базы данных. Вы можете выбрать предположим они были написаны с использованием часового пояса сервера, но это предположение вполне может быть ошибочным. Чтобы узнать часовой пояс любых дат или времени, хранящихся в данных, вы должны убедиться, что они хранятся с информацией о часовом поясе или (как и я) убедитесь, что они всегда в GMT.

почему предполагается, что данные были написано с использованием часового пояса сервера? Ну, во-первых, данные могли быть записаны с помощью соединения, которое установило другой часовой пояс. Возможно, база данных была перемещена с одного сервера на другой, где серверы находились в разных часовых поясах (я столкнулся с этим, когда унаследовал базу данных, которая переехала из Техаса в Калифорнию). Но!--21-->даже если данные записаны на сервере, с его текущим часовым поясом, это все еще неоднозначно. В прошлом году, в США, дневной свет Экономия времени была отключена в 2 часа ночи 1 ноября. Предположим, мой сервер находится в Калифорнии, используя Тихоокеанский часовой пояс, и у меня есть значение 2009-11-01 01:30:00 в базе данных. Когда это было? Было ли это 1: 30 утра 1 ноября PDT или 1: 30 ночи 1 ноября PST (час спустя)? У вас нет абсолютно никакого способа знать. Мораль: всегда храните даты/время в 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);

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


As Якуб Врана (Творца или проблемы и NotORM) упоминает в комментариях, чтобы выбрать текущее смещение часового пояса в TIME использование:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

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

Я сделал здесь cheatsheet:должен ли MySQL иметь часовой пояс, установленный в UTC?


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

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


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

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

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


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



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

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


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


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

SET LOCAL time_zone='Whatever'

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

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

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


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


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

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


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

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

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

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

UTC_TIMESTAMP

в MySQL UTC_TIMESTAMP возвращает текущую дату и время UTC как значение в 'YYYY-MM-DD HH:MM:SS' или YYYYMMDDHHMMSS.формат uuuuuu в зависимости от использования функции, т. е. в строковом или числовом контексте.

сейчас()

функция NOW (). MySQL NOW () возвращает значение текущей даты и времени в формате 'YYYY-MM-DD HH:MM:SS' или YYYYMMDDHHMMSS.формат uuuuuuu в зависимости от контекста (числовой или строковый) функции. ТЕКУЩАЯ_ОТМЕТКА_ВРЕМЕНИ, ТЕКУЩАЯ_ОТМЕТКА_ВРЕМЕНИ(), местное время, местное время(), LOCALTIMESTAMP, LOCALTIMESTAMP() являются синонимами сейчас().


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

выберите timediff(текущее_время(),utc_time())

как весь mysql

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

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

Если вам нужно использовать ваш запрос в сеансе с измененным time_zone ( по набор сеансов TIME_ZONE =) вы получите это С @@сессии.часовой пояс если вы запрашиваете @ @ global.time_zone вы получаете "система" поймать 22

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

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

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

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


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

//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