convert_tz возвращает null

96

Я знаю, это звучит глупо, но когда я использую

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

он выводит NULL. Я использую MySQL Workbench в Ubuntu 12.04 64 бит, и он работает на моем другом ноутбуке / ОС (также с использованием MySQL Workbench).

мохур
источник

Ответы:

181

Это произойдет, если вы не загрузили таблицу часовых поясов в mysql.

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

mysql - это имя встроенной базы данных, в которой хранятся данные конфигурации MySQL.

Barmar
источник
1
Вам просто нужно делать это один раз или каждый раз при запуске MySql?
Эйб Мисслер
3
Только раз. Он загружает информацию в таблицу в MySQL, которая используется с тех пор.
Barmar
2
Вы также можете использовать флаг force, чтобы переопределить любые ошибки, с которыми вы столкнулись: mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
scum
3
Мне также нужно было перезапустить демон MySQL, прежде чем он вступит в силу (в Debian).
Ekster
3
Привет, когда я запускаю эту команду, я получил такую ​​ошибку: Предупреждение: не удалось загрузить /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», «Азия / Джакарта») и просто вернет 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, выполнив поиск «services» в кнопке «Пуск» Windows.

5) Затем разархивируйте файл timezone_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 файлов, упомянутых в других ответах, приводят к 'Permission denied'
hepabolu
Кстати, мне не нужно было перезапускать MySQL.
hepabolu
1

Вот шаги, чтобы заставить его работать, если вы работаете в Windows и используете MySQL 5.7.

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

После успешного завершения вы сможете использовать 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

Это сработало для меня.

Рем
источник