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



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



обновление



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



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


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

775   16  

16 ответов:

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

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

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

почему предполагается, что данные были написано с использованием часового пояса сервера ошибочным? Ну, во-первых, данные могут быть записаны с использованием соединения, которое устанавливает другой часовой пояс. Возможно, база данных была перемещена с одного сервера на другой, где серверы находились в разных часовых поясах (я столкнулся с этим, когда унаследовал базу данных, которая переехала из Техаса в Калифорнию). Но даже если данные записаны на сервере, с его текущим часовым поясом, это все еще неоднозначно. В прошлом году, в Соединенных Штатах, дневной свет Экономия времени была отключена в 2:00 утра 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);

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

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

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

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

Я сделал чит-лист здесь:должно MySQL нет своего часового пояса по Гринвичу?

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. Установите @ @ сеанс.time_zone = "+00:00"; //таким образом, вы можете chnage часовой пояс только для вашего конкретного сеанса

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

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

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

вставьте фиктивную запись в одну из ваших баз данных, которая имеет метку времени Выберите эту запись и получите значение метки времени. Удалите эту запись. Возвращает точно часовой пояс, который сервер использует для записи данных и игнорирует часовые пояса 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 в зависимости от использования функции, т. е. в строковом или числовом контексте.

сейчас()

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

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

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

как и весь mysql

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

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

Если вам нужно использовать ваш запрос в сеансе с измененной time_zone ( by сеанс установлен 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

Comments

    Ничего не найдено.