我正在使用表格:
CREATE TABLE tv (
datetime datetime NOT NULL,
value int(4),
metric varchar(25),
PRIMARY KEY (datetime)
);
我的系统是在CET中,所以我从选择中得到了这个:
select * from tv;
+---------------------+-------+----------+
| datetime | value | metric |
+---------------------+-------+----------+
| 2017-08-09 14:17:27 | 0 | TV power |
| 2017-08-09 14:20:04 | 0 | TV power |
| 2017-08-09 14:40:04 | 0 | TV power |
| 2017-08-09 14:45:03 | 0 | TV power |
当我尝试绘制它时(在grafana中),我使用:
SELECT
UNIX_TIMESTAMP(datetime) as time_sec,
value,
metric
FROM tv
ORDER BY datetime
它的工作正常,但它将来还会花2个小时写出所有内容。所以我想这是因为UNIX_TIMESTAMP认为日期时间是UTC并查看系统值,因为它是CET,它在转换为epoch或类似之前正在执行+02:00。
我也得到了这个:
SELECT @@global.time_zone;
+--------------------+
| @@global.time_zone |
+--------------------+
| SYSTEM |
+--------------------+
1 row in set (0.00 sec)
表示正在使用系统时区CET。
如何让我的UNIX_TIMESTAMP正确转换为CET?
感谢。
答案 0 :(得分:0)
以下是documentation对UNIX_TIMESTAMP
所说的内容:
如果使用日期参数调用UNIX_TIMESTAMP(),则会将参数的值返回为自“1970-01-01 00:00:00”UTC以来的秒数。
根据我的理解,MySQL正在将输入时间戳转换为UTC时间,进行计算,然后仍然以UTC时间返回偏移。纠正此问题的一个选项是在调用UNIX_TIMESTAMP
之前将时间戳从“UTC”时间转换为“CET”时间。我在这里使用引号,因为你的时间戳已经在所需的CET时区,但是我们必须通过反击自己的努力来实现智能并将所有内容转换为UTC来欺骗MySQL。
这些方面应该有效:
SELECT
UNIX_TIMESTAMP(CONVERT_TZ(datetime, 'UTC', 'CET')) AS time_sec,
value,
metric
FROM tv
ORDER BY datetime
我们再次将您的时间戳从UTC转移到CET时间,以抵消UNIX_TIMESTAMP()
,这将与此相反。
如果上面CONVERT_TZ()
的调用对您不起作用,则可能需要花一些时间配置MySQL时区表。这是一个可以帮助你入门的问题:
Database returned an invalid value in QuerySet.dates()
作为最终评论,我认为最好的长期解决方案是将时间戳存储在UTC时间。然后,您只需转换传入和传出日期,但不需要转换内部MySQL计算。以UTC时间存储所有时间戳信息是一种常见的数据库实践。