web-dev-qa-db-ja.com

convert_tzはnullを返します

これは馬鹿げているように聞こえますが、

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

nULLを出力します。 Ubuntu 12.04 64ビットでMySQL Workbenchを使用していますが、他のラップトップ/ OSでも動作します(MySQL Workbenchも使用)。

83
mohur

これは、タイムゾーンテーブルをmysqlにロードしていない場合に発生します。

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

このスレッドは、受け入れられた回答(MySQLの開発サイトで同じ)でコマンドを実行した後、コマンドが次のようなタイムゾーン間で変換できなかった理由を理解しようとしてしばらく時間を費やした後に発見されました

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

OS Xには、問題を引き起こす2つのファイルがあります:/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でも運営しています。

いずれにせよ、この修正により修正プログラムを探している人にとっては頭痛の種がいくつか減ることを願っています。

24
Jim Schubert

Windows環境とは別に、次の方法でタイムゾーンを設定できます。

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

Windows環境では、

1. download Time zone description tables fromhttp://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 for CONVERT_TZを取得している場合は、これらのデータベーステーブルをダウンロードしてmysqlデータベースに挿入してください http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

今、あなたの問題は解決されます.. :)

13
Rakesh

WindowsでMySqlを使用している場合、タイムゾーンデータをmysqlスキーマにロードする必要があります。ここに良いHOWTOがあります: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

これを行わないと、関数CONVERT_TZは入力タイムゾーン(例: 'UTC'、 'Asia/Jakarta')を認識せず、単にNULLを返します。

2
Domenic D.
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が最後にnull文字を追加する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
1
Timo Huovinen

これらは、WindowsでMySQL 5.7を使用している場合に機能させるための手順です。

  1. [マイコンピュータ]/[コンピュータ]/[このPC]またはOSの名前を右クリックして、[プロパティ]を選択します。
  2. 左パネルから「システムの詳細設定」を選択します。
  3. [環境変数]を選択し、MySQL binディレクトリの完全なパス名を入力します(通常はC:\ Program Files\MySQL\MySQL Server 5.7\binにあります)。
  4. Cmdプロンプトを開き、mysql -u root -p passwordを使用してmysqlに入ります。
  5. use mysqlと入力して、MySQL DBを選択します。
  6. https://dev.mysql.com/downloads/timezones.html 」からファイル「timezone_YYYYc_posix_sql.Zip」(YYYYの代わりに、そのページで利用可能な最大年を2017や2018などに置き換えます)をダウンロードします=。
  7. それを抽出し、テキストエディターでファイルを開きます。
  8. 内容をコピーして、cmdプロンプトで実行します。

正常に完了すると、CONVERT_TZおよびその他のタイムゾーン関数を使用できるようになります。

1
Stranger

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=1

4)Windowsの[スタート]ボタンで「サービス」を検索して、MySQLサービスを停止します。

5)次に、timezone_2017c_posix.Zipを解凍し、その中のファイルをコピーし(ファイルを直接コピーし、フォルダー全体をコピーしないでください)、_C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\_に貼り付けます

6)MySQL 5.7の場合、timezone_2017c_posix.Zipは解凍後に.sqlファイルを提供するだけで、問題が解決しない場合があります。 MySQL 5.7を実行している場合でも、5.6のZipファイルをダウンロードして、それらのファイルを_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');およびnull以外の出力を確認します。

1
shanu

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/
0
Jaseem Abbas