安全地将UTC时间值插入mySQL TIMESTAMP变量的更好方法?

我的应用程序想要在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将在转换后存储该值.

上一篇:【转】设置CentOS系统时区为上海


下一篇:mysql-如何每天将查询结果限制为一定时间范围?