mysql select convert_tz returns null

mysql select convert_tz returns nullПривет,

Днес се сблъсках с един странен проблем при конвертиране на timezone в MySQL.

Проблемът беше следния : mysql select convert_tz returns null

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mysql> SELECT CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC');
+-----------------------------------------------------------+
| CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC') |
+-----------------------------------------------------------+
| NULL |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC'); +-----------------------------------------------------------+ | CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC') | +-----------------------------------------------------------+ | NULL | +-----------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> SELECT CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC');
+-----------------------------------------------------------+
| CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC') |
+-----------------------------------------------------------+
| NULL |
+-----------------------------------------------------------+
1 row in set (0.00 sec)

Това го дава въпреки настроената правилно timezone-а на сървъра :

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 1 row in set (0.00 sec)
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

Вместо NULL обаче трябва да вади валидна дата и час.

Този проблем се оправя с командата : mysql_tzinfo_to_sql , или накратко така :

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

И вече резултата от селекта изглежда така:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mysql> SELECT CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC');
+-----------------------------------------------------------+
| CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC') |
+-----------------------------------------------------------+
| 2016-11-01 18:00:00 |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC'); +-----------------------------------------------------------+ | CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC') | +-----------------------------------------------------------+ | 2016-11-01 18:00:00 | +-----------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> SELECT CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC');
+-----------------------------------------------------------+
| CONVERT_TZ('2016-11-01 18:00:00', 'Europe/London', 'UTC') |
+-----------------------------------------------------------+
| 2016-11-01 18:00:00 |
+-----------------------------------------------------------+
1 row in set (0.00 sec)

Това е!