convert_tz返回null


92

我知道这听起来很愚蠢,但是当我使用

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

它输出NULL。我在64位Ubuntu 12.04中使用MySQL Workbench,它可以在其他笔记本电脑/操作系统中使用(也使用MySQL Workbench)。

Answers:


173

如果您尚未将时区表加载到mysql中,则会发生这种情况。

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

1
您只需要执行一次,还是每次MySql启动时都执行一次?
安倍·米斯勒

3
就一次。它将信息加载到MySQL的表中,此后便使用。
Barmar

2
您也可以使用force标志来覆盖遇到的任何错误:mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
败类

3
我也需要重新启动MySQL守护程序才能生效(在Debian上)。
Ekster 2014年

2
嗨,当我运行此命令时,出现如下错误:警告:无法将“ /usr/share/zoneinfo/iso3166.tab”加载为时区。跳过它。警告:无法加载“ /usr/share/zoneinfo/zone.tab”作为时区。跳过它。
Ghanshyam Katriya,2015年

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

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。谢谢!
colonelclick

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)通过在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'); 并检查非空输出。


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. 右键单击“我的电脑” /“计算机” /“此PC”或操作系统中的任何名称,然后选择“属性”。
  2. 从左侧面板中选择“高级系统设置”。
  3. 选择“环境变量”,输入MySQL bin目录的完整路径名(通常它将位于C:\ Program Files \ MySQL \ MySQL Server 5.7 \ bin)。
  4. 打开cmd提示符,使用进入mysql mysql -u root -p password
  5. 输入use mysql以选择MySQL数据库。
  6. https://dev.mysql.com/downloads/timezones.html下载文件“ timezone_YYYYc_posix_sql.zip”(代替YYYY,替换该页面中可用的最大年份,如2017或2018)。
  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手册页/本地/” | ./mysql -u根mysql

这对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.