我的应用程序想要在mySQL数据库的TIMESTAMP变量中插入时间戳值.时间戳值是UTC时间,格式为“ YYYY-MM-DD HH:MM:SS”.问题是我的SQL Server设置为使用SYSTEM时间(SELECT @@ global.time_zone表示SYSTEM),而系统时区为Europe / London(服务器运行Ubuntu 14.04),因此mySQL进行了夏时制转换并将值存储在应有的值一小时之外. (我想如果我是在其他时区(例如CST),那么我会有不想要的时区偏移以及夏令时).
为了使mySQL做正确的事情,似乎我需要在插入UTC时间戳之前将它隐蔽到系统时间中,以便mySQL可以将它从系统时间转换为UTC时间,然后再内部存储它.这一段代码具有预期的效果:
mysql> select timestamp("2015-05-06 12:34:56")+CURRENT_TIMESTAMP-UTC_TIMESTAMP;
+------------------------------------------------------------------+
| timestamp("2015-05-06 12:34:56")+CURRENT_TIMESTAMP-UTC_TIMESTAMP |
+------------------------------------------------------------------+
| 20150506133456.000000 |
+------------------------------------------------------------------+
我现在要使用它,但是似乎有点儿麻烦了,所以有更好的方法吗?
[编辑] RTFM的另一轮给了我这个主意…
mysql> select CONVERT_TZ("2015-05-06 12:34:56", "+00:00", "SYSTEM");
+-------------------------------------------------------+
| CONVERT_TZ("2015-05-06 12:34:56", "+00:00", "SYSTEM") |
+-------------------------------------------------------+
| 2015-05-06 13:34:56 |
+-------------------------------------------------------+
看起来很干净.还有更好的主意吗?
解决方法:
您可能可以使用CONVERT_TZ
函数,该函数使用指定的时区而不是系统时区来解析日期:
SELECT CONVERT_TZ('2015-05-06 12:34:56','+00:00','SYSTEM') AS `Local Time`,
UNIX_TIMESTAMP(CONVERT_TZ('2015-05-06 12:34:56', '+00:00', 'SYSTEM')) AS `UNIX Timestamp`;
+---------------------+----------------+
| Local Time | UNIX Timestamp |
+---------------------+----------------+
| 2015-05-06 17:34:56 | 1430915696 |
+---------------------+----------------+
本地时间值将有所不同,具体取决于运行查询的系统.但是,UNIX时间戳记值将相同.
然后,您可以在时间戳列中插入本地时间值; MySQL将在转换后存储该值.