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

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

ОБНОВИТЬ

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

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

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

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

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

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

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

 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 

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

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

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

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

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

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

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

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

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

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

Моя инфраструктура PHP использует

 SET LOCAL time_zone='Whatever' 

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

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

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

Используйте LPAD (TIME_FORMAT (TIMEIFF (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 ())

as is whole mysql

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

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

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

если вы попробуете датированный, 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 
  • Изменение часового пояса MySQL?
  • Как конвертировать datetime в timestamp с помощью C # /. NET (игнорируя текущий часовой пояс)
  • Как обрабатывать календарные часовые пояса с помощью Java?
  • Как справиться с летней экономией, используя TimeZone в Java
  • Как использовать пользовательское время в браузере для проверки разницы во времени между клиентом и сервером
  • Параметр DateTime с часовым поясом формы PST / CEST / UTC / etc.
  • iOS: конвертировать UTC NSDate в локальный часовой пояс
  • Заставить часовой пояс Java как GMT / UTC
  • Всегда ли полезно хранить время в UTC или это тот случай, когда лучше хранить в местное время?
  • Как хранить дату и время и временные метки в часовом поясе UTC с JPA и Hibernate
  • Java: Как вы конвертируете временную метку UTC в локальное время?
  • Давайте будем гением компьютера.