Кто-нибудь знает, есть ли такая функция в MySQL?
ОБНОВИТЬ
Это не выводит никакой действительной информации:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
Или, может быть, сам MySQL не может точно знать, что именно time_zone
используется, это нормально, мы можем участвовать PHP
здесь, пока я могу получить достоверную информацию, а не SYSTEM
...
@@system_time_zone
как указано в моем ответе ниже.Ответы:
Из руководства ( раздел 9.6 ):
Редактировать Вышеприведенное возвращается,
SYSTEM
если MySQL установлен как подчиненный для часового пояса системы, что менее чем полезно. Поскольку вы используете PHP, если ответ от MySQLSYSTEM
, вы можете спросить систему, через какой часовой пояс он используетdate_default_timezone_get
. (Конечно, как VolkerK отметил, PHP может быть запущен на другом сервере, но предположения идут, предполагая , веб - сервер и сервер БД он разговаривает будут установлены в [если на самом деле не в ] тот же часовой пояс не является огромный скачок.) Но учтите, что (как и в MySQL), вы можете установить часовой пояс, который использует PHP (date_default_timezone_set
), что означает, что он может сообщать значение, отличное от используемого ОС. Если вы контролируете код PHP, вы должны знать, делаете ли вы это, и все будет в порядке.Но весь вопрос о том, какой часовой пояс использует сервер MySQL, может быть касательным, потому что запрос сервера о том, в каком часовом поясе он находится, абсолютно ничего не говорит о данных в базе данных. Читайте дальше для деталей:
Дальнейшее обсуждение :
Если вы контролируете сервер, конечно, вы можете убедиться, что часовой пояс является известным количеством. Если вы не контролируете сервер, вы можете установить часовой пояс, используемый вашим соединением, следующим образом:
Это устанавливает часовой пояс в GMT, так что любые дальнейшие операции (например
now()
) будут использовать GMT.Обратите внимание, что значения времени и даты не хранятся вместе с информацией о часовом поясе в MySQL:
Поэтому знание часового пояса сервера важно только с точки зрения функций, которые получают время прямо сейчас, например
now()
,unix_timestamp()
и т. Д .; он ничего не говорит вам о том, какой часовой пояс используют даты в данных базы данных. Вы можете предположить, что они написаны с использованием часового пояса сервера, но это предположение может быть ошибочным. Чтобы узнать часовой пояс любых дат или времени, хранящихся в данных, вы должны убедиться, что они хранятся вместе с информацией о часовом поясе или (как я знаю), всегда в GMT.Почему предполагается, что данные были записаны с использованием часового пояса сервера? Ну, во-первых, данные могут быть записаны с использованием соединения, которое устанавливает другой часовой пояс. База данных, возможно, была перемещена с одного сервера на другой, где серверы находились в разных часовых поясах (я столкнулся с этим, когда унаследовал базу данных, которая была перемещена из Техаса в Калифорнию). Но даже если данные записаны на сервере с его текущим часовым поясом, они все равно неоднозначны. В прошлом году в Соединенных Штатах летнее время было выключено в 2 часа ночи 1 ноября. Предположим, мой сервер в Калифорнии использует часовой пояс Тихого океана, и у меня есть значение
2009-11-01 01:30:00
в базе данных. Когда это было? Было ли это 1:30 утра 1 ноября по тихоокеанскому времени или 1:30 ночи 1 ноября по тихоокеанскому времени (час спустя)? У вас нет абсолютно никакого способа узнать. Мораль: всегда храните дату / время в GMT (что не делает DST) и конвертируйте в желаемый часовой пояс по мере необходимости.источник
DATETIME
Тип mySQL не содержит информацию о часовом поясе. Поэтому я думаю, что предполагаемая базовая философия заключается в том, чтобы MySQL был настолько слепым, насколько это возможно, к часовому поясу - это означает, что пользователь должен придерживаться одного часового пояса, либо UTC, либо часового пояса, в котором находится сервер, хранить все в этой зоне и делать какие-либо преобразования на уровне приложения или с помощьюCONVERT_TZ()
( dev.mysql.com/doc/refman/5.0/en/… ) По крайней мере, так я всегда понимал, как это должно работать, глядя на разреженные опции, которые mySQL предоставляет в этой области.now()
в PHP?Запрос ниже возвращает часовой пояс текущего сеанса.
источник
select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
прощеSELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
получить разницу в секундах.Просто
SELECT @@system_time_zone;
Возврат
PST
(или что-либо, имеющее отношение к вашей системе).Если вы пытаетесь определить часовой пояс сеанса, вы можете использовать этот запрос:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
Который будет возвращать часовой пояс сеанса, если он отличается от системного часового пояса.
источник
Как Якуб Vrána (Создатель или Adminer и NotORM ) упоминает в комментариях, чтобы выбрать текущее смещение часового пояса в
TIME
использовании:Он вернется:
02:00:00
если ваш часовой пояс +2: 00 на эту датуЯ сделал здесь шпаргалку: должен ли MySQL иметь часовой пояс с UTC?
источник
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
получить разницу в секундах.02:00:00
, соответствующий TIMESTAMPDIFF вернется,-2
если единицей является ЧАС,-120
если единицей является МИНУТА и т. Д. Чтобы получить знак, соответствующий часовому поясу , поменяйте местами параметры:SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())
вернет ожидаемый120
для часового пояса +2: 00. Причина для указания минут состоит в том, что есть несколько часовых поясов со смещением 30 или 45 минут, см. En.wikipedia.org/wiki/Time_zoneЧтобы получить текущий часовой пояс MySQL, вы можете сделать следующие вещи:
Теперь, если вы хотите изменить часовой пояс mysql, тогда:
источник
Это вернет часовой пояс как целое число (например:)
-6
, обрабатывая положительное или отрицательное время (вот гдеEXTRACT
вступает в игру:HOUR
одна функция возвращает отрицательные часовые пояса как положительные).источник
Чтобы кто-нибудь пришел, чтобы найти часовой пояс MySQL БД.
С помощью этого запроса вы можете получить текущий часовой пояс:
источник
Упоминание команды в описании возвращает "SYSTEM", которая указала, что она использует часовой пояс сервера. Что не полезно для нашего запроса.
Следующий запрос поможет понять часовой пояс
Выше запрос даст вам интервал времени по отношению к всемирному координированному времени (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
системную переменную. Это помогает?источник
Мой PHP-фреймворк использует
на после подключения, где «Безотносительно» == date_default_timezone_get ()
Не мое решение, но это гарантирует, что
SYSTEM
часовой пояс сервера MySQL всегда совпадает с часовым поясом PHPТак что, да, PHP сильно вовлечен и может повлиять на него
источник
Чтобы узнать текущее время в соответствии с вашим часовым поясом, вы можете использовать следующее (в моем случае это «+5: 30»)
источник
Вам просто нужно перезапустить mysqld после изменения часового пояса системы.
Глобальный часовой пояс MySQL занимает часовой пояс Системы. Когда вы изменяете любой такой атрибут системы, вам просто нужно перезапустить Mysqld.
источник
Вставьте фиктивную запись в одну из ваших баз данных с временной меткой. Выберите эту запись и получите значение временной метки. Удалить эту запись. Получает точно часовой пояс, который сервер использует для записи данных, и игнорирует часовые пояса PHP.
источник
Вы можете попробовать следующее:
Здесь вы можете указать разницу во времени в секундах
источник
Используйте
LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')
для получения значения в формате часового пояса MySQL, с которым вы можете удобно использоватьCONVERT_TZ()
. Обратите внимание, что полученное вами смещение часового пояса действительно только в тот момент, когда выражение вычисляется, поскольку смещение может меняться со временем, если у вас есть переход на летнее время. Тем не менее, выражение полезно вместе с тем,NOW()
чтобы хранить смещение с местным временем, которое устраняет неоднозначность того, чтоNOW()
дает. (В часовых поясах DST происходит переходNOW()
назад на один час в год, поэтому он имеет несколько повторяющихся значений для разных моментов времени).источник
Может быть
Вы не получите значение часового пояса напрямую таким образом.
@@global.time_zone
не может использоваться как переменная, и возвращает значение'SYSTEM'
.Если вам нужно использовать ваш запрос в сеансе с измененным часовым поясом
session SET TIME_ZONE =
, то вы получите его с помощью@@session.time_zone
. Если вы запросите@@global.time_zone
, то вы получите'SYSTEM'
.Если вы пытаетесь
datediff
,date_sub
илиtimediff
сnow()
иutc_time()
, то вы, вероятно, столкнетесь с проблемами конверсии.Но вещи, предложенные выше, вероятно, будут работать по крайней мере с некоторыми версиями сервера. Моя версия 5.5.43-37 и является хост-решением.
источник
Попробуйте использовать следующий код:
источник