convert_tz返回null

时间:2013-01-22 08:25:58

标签: mysql ubuntu-12.04 convert-tz

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

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

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

9 个答案:

答案 0 :(得分:148)

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

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

答案 1 :(得分:24)

我花了一些时间试图弄清楚为什么在接受的答案中运行命令后(在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开展工作。

无论如何,我希望这为搜索修复程序的任何人节省了一些麻烦。

答案 2 :(得分: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

现在你的问题将会解决.. :)

答案 3 :(得分:2)

如果您在Windows上使用MySql,则必须将时区数据加载到mysql架构中。这是一个很好的HOWTO:http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

如果你不这样做,CONVERT_TZ函数将无法识别你的输入时区(即你的例子:'UTC','Asia / Jakarta'),并且只会返回NULL。

答案 4 :(得分: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

答案 5 :(得分:1)

如果你在Windows中并使用MySQL 5.7,这些步骤可以使它工作。

  1. 右键单击“我的电脑/电脑/此电脑”或操作系统中的任何名称,然后选择“属性”。
  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数据库。
  6. https://dev.mysql.com/downloads/timezones.html下载文件“timezone_YYYYc_posix_sql.zip”(代替YYYY,替换该页面中可用的最长年份,如2017年或2018年)。
  7. 解压缩并在文本编辑器中打开文件。
  8. 复制内容并在cmd提示符下执行。
  9. 成功完成后,您应该可以使用CONVERT_TZ和其他时区功能。

答案 6 :(得分:1)

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文件,但可能无法解决问题。所以继续下载5.6的zip文件,即使你运行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');  并检查非空输出。

答案 7 :(得分:0)

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/

答案 8 :(得分:0)

在使用XAMPP的Mac OS Catalina上,

转到终端中的/ Applications / XAMPP / xamppfiles / bin文件夹,然后运行以下命令。

./ mysql_tzinfo_to_sql / usr / share / zoneinfo | sed -e“必须设置s /本地时区-请参见zic手册页/本地/” | ./mysql -u根mysql

这对我有用。