Як отримати поточний часовий пояс MySQL?


217

Хтось знає, чи є така функція в MySQL?

ОНОВЛЕННЯ

Це не виводить жодної дійсної інформації:

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

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


3
"ми можемо включити PHP тут" - і чи буде цей екземпляр php завжди знаходитися на тій же машині, що і сервер MySQL?
VolkerK

Так, вони будуть на одній машині.
користувач198729

10
Спробуйте, @@system_time_zoneяк зазначено у моїй відповіді нижче.
Андрій

Оскільки було задано запитання, було додано більше відповідей, можливо, перегляньте прийняту відповідь?
Тімо Хуовінен

1
Навіть незважаючи на те, що сервер MySQL і PHP на одному сервері, вони можуть вибирати різні часові пояси залежно від їх налаштувань. І ці часи можуть відрізнятися від того, що показує ваша ОС, і PHP / MySQL.
Бімал Пудель

Відповіді:


227

З посібника ( розділ 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.

Чому припускаємо, що дані були записані за допомогою помилок часового поясу сервера? Ну, для одного, дані, можливо, були записані за допомогою з'єднання, яке встановило інший часовий пояс. База даних, можливо, була перенесена з одного сервера на інший, де сервери були в різних часових поясах (я наткнувся на це, коли я успадкував базу даних, яка переїхала з Техасу в Каліфорнію). Але навіть якщо дані записані на сервері, з його поточним часовим поясом, це все одно неоднозначно. Минулого року у Сполучених Штатах 1 листопада 1 години ранку було відключено літній час. Припустимо, мій сервер знаходиться в Каліфорнії, використовуючи тихоокеанський часовий пояс, і я маю значення2009-11-01 01:30:00в базі даних. Коли це було? Це був 1:30 ранку 1 листопада PDT або 1:30 ранку 1 листопада PST (через годину)? У вас немає абсолютно ніякого способу знати. Мораль: Завжди зберігайте дати / часи в GMT (що не робить DST) та конвертуйте у потрібний часовий пояс у міру необхідності.


5
@ user198729: Це не безглуздо , хоча це не настільки корисно, як я сподівався. Що це означає: Запитайте ОС, MySQL - це раб.
TJ Crowder

Цікаво, чому ми повинні самі встановлювати часовий пояс, а потім отримувати його? Цей вид перемагає мету, чи не так? Я хочу сказати, що я хотів би запитати MySQL про часовий пояс, тому що я не знаю відповіді. Можливо, я розгубився і помилився. Може хтось пояснить?
Senthil

1
@Senthil Тип mySQL DATETIMEне містить інформації про часовий пояс. Тому я вважаю, що філософія, що лежить в основі, полягає в тому, щоб mySQL був максимально сліпим для часового поясу - це означає, що користувач може дотримуватися одного часового поясу, або UTC, або часового поясу, на якому працює сервер, зберігати все в цій зоні та робити будь-які перетворення на рівні програми або використовуючи CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… ) Принаймні, саме так я завжди розумів, як це має працювати, дивлячись на розрізнені параметри, які mySQL надає в цьому полі.
Пекка

Дякую, але це все ще не вирішено, як отримати інформацію про tz за результатом роботи now()в PHP?
user198729

Я повністю погоджуюся з частиною "дотримуватися одного часового поясу під час збереження часової позначки" .. Але це-> ".. або часовий пояс, на якому знаходиться сервер .." як це ви дізнаєтеся? Скажімо, ви зберегли всі значення часової позначки як UTC. Але ваш сервер знаходиться в іншому часовому поясі, і ви хочете показати значення часових позначок відповідно до цього часового поясу. Тож як ви дізнаєтеся, в якому часовому поясі знаходиться ваш сервер? Лише тоді ви можете передати певне значення CONVERT_TZ (), щоб перетворити його правильно?
Senthil

196

Запит нижче повертає часовий пояс поточного сеансу.

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

6
Це дійсно правильна відповідь, оскільки вона демонструє, що "СИСТЕМА" визнається часовим поясом при перетворенні, що робить її цілком достатньою для перетворення, наприклад, NOW () у будь-який часовий пояс.
nilskp

5
Дякую, скориставшись цим, я зміг отримати потрібний формат:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker

97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)простіше.
Jakub Vrána

3
Або SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);отримати різницю в секундах.
філфрео

106

Просто SELECT @@system_time_zone;

Повертається PST (або все, що стосується вашої системи).

Якщо ви намагаєтеся визначити часовий пояс сеансу, ви можете використовувати цей запит:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Який поверне часовий пояс сеансу, якщо він відрізняється від системного часового поясу.


6
Єдиним недоліком є ​​те, що якщо часовий пояс зміниться через зміни літнього часу, він все одно буде повідомляти про той, який був "запам’ятатий" під час запуску сервера, див. Помилку mysql 9518
Марк

72

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

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Він повернеться: 02:00:00якщо для цієї дати ваш часовий пояс +2: 00

Тут я створив шпаргалку: чи повинен MySQL встановити часовий пояс на UTC?


Або SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);отримати різницю в секундах.
філфрео

доповнення до @philfreo - зауважте, що параметри слід змінити в TIMESTAMPDIFF порівняно з TIMEDIFF. Для того, щоб взяти приклад , наведений в цій відповіді, якщо TimeDiff повертає 02:00:00відповідний TIMESTAMPDIFF повернеться , -2якщо блок ЧАС, -120якщо пристрій ХВИЛИНИ і т.д. Щоб отримати знак відповідає часовому поясу, поміняти параметри: SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())поверне очікуваний 120для часового поясу +2: 00. Причина вказувати хвилини - чи є кілька часових поясів, які зміщені на 30 або 45 хвилин, див. En.wikipedia.org/wiki/Time_zone
ToolmakerSteve

1
це набагато краща відповідь, ніж прийнята відповідь, оскільки вона відповідає на питання безпосередньо і дає рішення замість просто теорії.
supersan

10

Щоб отримати поточний часовий пояс mysql, можна виконати наступні дії:

 1. SELECT @@system_time_zone;   //from this you can get the system timezone 
 2. SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) //This will give you time zone if system timezone is different from global timezone

Тепер, якщо ви хочете змінити часовий пояс mysql:

 1. SET GLOBAL time_zone = '+00:00'   //this will set mysql timezone in UTC
 2. SET @@session.time_zone = "+00:00";  //by this you can chnage the timezone only for your particular session 

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

Це поверне часовий пояс у вигляді цілого числа (наприклад:) -6, обробляючи позитивні чи негативні часи (ось де EXTRACTвступає в дію: HOURодна функція повертає негативні часові пояси як позитивні).


6

Щоб хтось прийшов знайти часовий пояс mysql db.

За допомогою цього запиту ви можете отримати поточний часовий пояс:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

4

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

Наступний запит допоможе зрозуміти часовий пояс

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

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

UTC_TIMESTAMP

У MySQL UTC_TIMESTAMP повертає поточну дату та час UTC як значення у форматі "РРРР-MM-DD HH: MM: SS" або YYYYMMDDHHMMSS.uuuuuu залежно від використання функції, тобто в рядковому чи числовому контексті.

ЗАРАЗ ()

ЗАРАЗ () функція. MySQL NOW () повертає значення поточної дати та часу у форматі "РРРР-MM-DD HH: MM: SS" або форматі YYYYMMDDHHMMSS.uuuuuu залежно від контексту (числового або рядкового) функції. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () - синоніми NOW ().


2

Ознайомтеся з підтримкою часової зони MySQL Server та system_time_zoneсистемною змінною. Чи допомагає це?


@user, можете, будь ласка, уточнити у своєму питанні, яку інформацію ви точно шукаєте (часовий пояс сервера? Клієнт?) та які інструменти є у вашому розпорядженні? Ви згадуєте PHP. Чи можете ви отримати доступ до командного рядка?
Pekka

5
@user також, я вважаю, що ти стикаєшся, як якийсь хуй, що зволікає відповіді від людей, які намагаються бути корисними, а не зовсім неправильними. Я не проти голосування, ні втрати точки, але ваше ставлення зовсім не спонукає шукати далі рішення.
Пекка

3
@user, як я вже говорив, ваше ставлення не мотивує мене шукати подальші відповіді для вас, особливо з огляду на мізерну інформацію, яку ви надаєте. Вибачте.
Пекка

3
@ user198729: Нічого, втрачайте ставлення. Пекка такий тип хлопця, який справді допомагає людям. Якщо ввічливості однієї недостатньо, щоб мотивувати вас, спробуйте власний інтерес.
TJ Crowder

2
Лише мої думки: я б не образився, якби користувач зробив те саме на мою посаду. Я маю на увазі, тиск або розчарування в кінцеві терміни дійсно додають грубих меж навколо людей, але я думаю, ми повинні дозволити це певною мірою. Можливо, я занадто прощаю: |
Senthil

1

Моя програма PHP використовує

SET LOCAL time_zone='Whatever'

після підключення, де "Що б то не було" == date_default_timezone_get ()

Це не моє рішення, але це гарантує, що SYSTEMчасовий пояс MySQL-сервера завжди такий самий, як і PHP

Отже, так, PHP сильно задіяний і може вплинути на це


1

Щоб визначити поточний час відповідно до вашого часового поясу, ви можете використовувати наступне (у моєму випадку його "+5: 30")

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


0

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

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


після зміни часового поясу в ОС, вставки mysql використовуватимуть новий часовий пояс, але вибирають зараз (); і виберіть current_timestamp; Команди все ще будуть використовувати старий часовий пояс. Щоб синхронізувати все це, службу mysql необхідно перезапустити.
Маной Кумар Г

0

Вставте фіктивний запис в одну з ваших баз даних, яка має часову позначку. Виберіть цей запис і отримайте значення часової мітки. Видаліть цей запис. Отримує впевненість часовий пояс, який використовує сервер для запису даних, і ігнорує часові пояси PHP.


0

Ви можете спробувати наступне:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

Тут ви можете вказати різницю часу у секундах


1
не слід додавати і віднімати компенсації. з правилами денного світла і т. д. це мінне поле
eweb

0

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


0

Це може бути

select timediff(current_time(),utc_time())

Ви не отримаєте значення часового поясу безпосередньо таким чином.

@@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 і є прийнятим рішенням.


Це чітко не відповідає на питання. Можливо, ви можете відредагувати його, щоб зосередитись на заданому питанні.
Могсдад

-3

Спробуйте використовувати наступний код:

//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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.