convert_tz повертає null


92

Я знаю, що це звучить по-дурному, але коли я використовую

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time

він виводить NULL. Я використовую MySQL Workbench в Ubuntu 12.04 64 bit, і він працює в інших моїх ноутбуках / ОС (також за допомогою MySQL Workbench).

Відповіді:


175

Це станеться, якщо ви не завантажили таблицю часових поясів у mysql.

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

1
Вам просто потрібно зробити це один раз, або кожен раз, коли MySql запускається?
Abe Miessler

3
Тільки один раз. Він завантажує інформацію в таблицю в MySQL, яка з цього часу використовується.
Бармар

2
Ви можете використовувати прапор сили, щоб також замінити будь-які помилки, з якими ви стикаєтесь: mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
накип

3
Мені також потрібно було перезапустити демон MySQL, перш ніж він набуде чинності (на Debian).
Екстер,

2
Привіт, коли я запускаю цю команду, у мене з’являється така помилка: Попередження: Не вдається завантажити '/usr/share/zoneinfo/iso3166.tab' як часовий пояс. Пропускаючи це. Попередження: Не вдається завантажити '/usr/share/zoneinfo/zone.tab' як часовий пояс. Пропускаючи це.
Ghanshyam Katriya

26

Я знайшов цей потік, витративши деякий час, намагаючись зрозуміти, чому після запуску команди у прийнятій відповіді (що однаково на сайті розробника MySQL) команда не змогла перетворити між часовими поясами, такими як

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','MET') AS time

Виявляється, в OS X є два файли, які викликають проблеми: /usr/share/zoneinfo/Factoryі /usr/share/zoneinfo/+VERSION.

Виправлення ... тимчасове переміщення цих файлів в інше місце, наприклад /usr/share/zoneinfo/.bak/ дозволяє команду

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

повністю заповнити всю очікувану інформацію про часовий пояс.

Це може бути або не бути помилкою в моїй встановленій версії MySQL:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.11, for osx10.6 (x86_64) using  EditLine wrapper

Я також працюю в STRICT_MODE .

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


13

Окрім середовища Windows, Ви можете встановити часовий пояс за

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

У середовищі Windows

1. download Time zone description tables from http://dev.mysql.com/downloads/timezones.html

2. Stop MySQL server

3. Put then inside Mysql installation package (тобто C: \ Program Files \ MySQL \ data \ mysql) `

4. Start MySQL server

..Вашу роботу закінчено ..

Якщо ви все ще отримуєте NULLдля CONVERT_TZ Завантажити ці таблиці бази даних та вставити їх у базу даних mysql http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

Тепер ваша проблема буде вирішена .. :)


2

Якщо ви використовуєте MySql в Windows, вам доведеться завантажувати дані часового поясу в схему mysql. Ось хороший HOWTO: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

Якщо ви цього не зробите, функція CONVERT_TZ не розпізнає ваш введений часовий пояс (тобто ваші приклади: 'UTC', 'Asia / Jakarta'), а просто поверне NULL.


2

MAMP PRO

  1. відчинено Terminal
  2. cd /usr/share/zoneinfo/
  3. sudo mv +VERSION ~/Desktop
  4. cd /applications/MAMP/Library/bin
  5. sudo ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -p -u root mysql
  6. sudo mv ~/Desktop/+VERSION /usr/share/zoneinfo/

Окрім розташування двійкової папки, це стосується взагалі macOS. Дякую!
полковник клік

2

1) У Windows зараз немає жодної папки даних, C:\Program Files\MySQL\як в інших відповідях.

2) У такому випадку шукайте C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql. Як правило, ця папка прихована, і ви не побачите C:\ProgramData\кілька разів.

3) Змініть налаштування на вкладці Перегляд, щоб побачити приховані файли та папки, як пояснено тут https://irch.info/index.php?pg=kb.page&id=133

4) Зупиніть службу MySQL, шукаючи "послуги" в кнопці Пуск Windows.

5) Потім розпакуйте часовий пояс_2017c_posix.zip, а потім скопіюйте в нього файли (скопіюйте файли безпосередньо, не копіюйте саму папку) і вставте C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6) Для MySQL 5.7, timezone_2017c_posix.zip просто видасть файл .sql після розпакування, і це може не вирішити проблему. Отже, завантажте zip-файл для версії 5.6, навіть якщо у вас запущена MySQL 5.7, і скопіюйте ці файли вC:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\

7) Перезапустіть сервер MySQL. Щоб перевірити, чи працює CONVERT_TZ (), запустіть цей запит sql.

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta'); і перевірте ненульовий вивід.


1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

якщо ви отримуєте помилку, data too long for column 'abbreviation' at row 1 тоді дивіться: https://bugs.mysql.com/bug.php?id=68861

виправлення полягало б у запуску наступного

це додасть рядок для вимкнення режиму mysql і дозволить mysql вставляти усічені дані, що сталося через помилку mysql, де mysql додав би нульовий символ в кінці (згідно з посиланням вище)

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql

echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql

mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql

У мене OSX El Capitan, і це єдина відповідь, щоб змусити його працювати. Для подальшого використання: у моєму випадку в помилці зазначено: "Дані занадто довгі для стовпця" Скорочення "в рядку 1". Примітка: усі спроби зробити (sudo) mkdir або (sudo) mv файлів, згаданих в інших відповідях, призводять до 'Дозвіл відмовлено'
hepabolu

До речі, мені не потрібно було перезапускати MySQL.
hepabolu

1

Це кроки, щоб змусити це працювати, якщо ви перебуваєте у Windows і використовуєте MySQL 5.7.

  1. Клацніть правою кнопкою миші на Мій комп’ютер / Комп’ютер / Цей ПК або будь-яке інше ім’я у вашій ОС та виберіть Властивості.
  2. Виберіть "Розширені налаштування системи" на лівій панелі.
  3. Оберіть "Змінні середовища", введіть повне ім'я шляху до вашого каталогу смітника MySQL (як правило, він буде в, C: \ Program Files \ MySQL \ MySQL Server 5.7 \ bin).
  4. Відкрийте підказку cmd, введіть в mysql за допомогою mysql -u root -p password.
  5. Введіть, use mysqlщоб вибрати БД MySQL.
  6. Завантажте файл "timezone_YYYYc_posix_sql.zip" (замість РРРР підставте максимальний рік, доступний на цій сторінці, наприклад 2017 або 2018 рік) з https://dev.mysql.com/downloads/timezones.html .
  7. Витягніть його та відкрийте файл у текстовому редакторі.
  8. Скопіюйте вміст і виконайте в підказці cmd.

Після успішного завершення ви зможете використовувати CONVERT_TZта інші функції часового поясу.


0

У Mac OS Catalina під час використання XAMPP,

Перейдіть до папки / Applications / XAMPP / xamppfiles / bin у Терміналі, після чого запустіть наступне.

./mysql_tzinfo_to_sql / usr / share / zoneinfo | sed -e "s / Місцевий часовий пояс повинен бути встановлений - див. сторінку керівництва zic / local /" | ./mysql -u корінь mysql

Це спрацювало для мене.

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