我正在尝试将时区加载到我的MySql实例(在Ubuntu上运行),以便我可以使用CONVERT_TZ函数,但是当我运行以下命令时:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
我得到以下输出,当我尝试使用CONVERT_TZ
时,它只返回NULL
:
警告:无法加载'/ usr / share / zoneinfo / Asia / Riyadh87'作为时间 区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / Asia / Riyadh88'为时区。跳过它。 警告:无法加载'/ usr / share / zoneinfo / Asia / Riyadh89'作为时间 区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / Mideast / Riyadh87'作为时区。跳过它。 警告:无法加载'/ usr / share / zoneinfo / Mideast / Riyadh88'作为时间 区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / Mideast / Riyadh89'为时区。跳过它。 警告:无法加载'/usr/share/zoneinfo/iso3166.tab'作为时间 区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / posix / Asia / Riyadh87'作为时区。跳过它。 警告:无法加载'/ usr / share / zoneinfo / posix / Asia / Riyadh88' 时区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / posix / Asia / Riyadh89'作为时区。跳过它。 警告:无法加载'/ usr / share / zoneinfo / posix / Mideast / Riyadh87' 作为时区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / posix / Mideast / Riyadh88'作为时区。跳绳 它。警告:无法加载 '/ usr / share / zoneinfo / posix / Mideast / Riyadh89'作为时区。跳绳 它。警告:无法加载'/ usr / share / zoneinfo / right / Asia / Riyadh87' 作为时区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / right / Asia / Riyadh88'为时区。跳过它。 警告:无法加载'/ usr / share / zoneinfo / right / Asia / Riyadh89' 时区。跳过它。警告:无法加载 '/ usr / share / zoneinfo / right / Mideast / Riyadh87'作为时区。跳绳 它。警告:无法加载 '/ usr / share / zoneinfo / right / Mideast / Riyadh88'为时区。跳绳 它。警告:无法加载 '/ usr / share / zoneinfo / right / Mideast / Riyadh89'作为时区。跳绳 它。警告:无法加载'/usr/share/zoneinfo/zone.tab'作为时间 区。跳过它。
有没有人知道为什么会这样?
PS:
我正在使用以下方法转换日期时间:
CONVERT_TZ(NOW(),'UTC', 'PCT')
我是否可能只是错误地转换,这是NULL结果的原因?
答案 0 :(得分:25)
这是Debian上Riyadh *的时区文件的错误:
http://bugs.mysql.com/bug.php?id=20545
建议的解决方法是忽略警告(如果您当然不需要这些时区):
mysql_tzinfo_to_sql /usr/share/lib/zoneinfo | mysql -uroot --force mysql
使用--force
选项导入TZ数据后,您将可以使用CONVERT_TZ
。这是我刚才所做的转录:
sh$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p mysql --force 2> /dev/null
Enter password: ********
sh$ mysql -p
Enter password: ********
Server version: 5.1.49-3 (Debian)
mysql> select convert_tz(now(), 'UTC', 'CET');
+---------------------------------+
| convert_tz(now(), 'UTC', 'CET') |
+---------------------------------+
| 2013-08-13 21:04:34 |
+---------------------------------+
1 row in set (0.00 sec)
答案 1 :(得分:2)
不幸的是,Sylvain的解决方案对我没有用。
我能够通过从我的开发计算机的PHPMyAdmin
(在Windows上)导出表格并稍微调整创建脚本来填充生产服务器的时区表。
由于脚本太长而无法在帖子中共享,因此我会将其托管在我的Google云端硬盘上。
安装脚本(删除了新行和注释):
https://drive.google.com/file/d/0B7iwL5F-hwr_YkItRXk2Z1VZdlE/view?usp=sharing
带注释的脚本:
https://drive.google.com/file/d/0B7iwL5F-hwr_dWdjTDREcXNHQmM/view?usp=sharing
确保使用没有评论的版本。评论版本需要大约5分钟才能运行,并且由于某种原因最终失败,而剥离版本运行时间不到5秒。
注意:您可能需要以root
身份运行才能实现此目的。