mysql获得纪元时间

时间:2017-08-09 12:54:20

标签: mysql timezone

我正在使用表格:

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?

感谢。

1 个答案:

答案 0 :(得分:0)

以下是documentationUNIX_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时间存储所有时间戳信息是一种常见的数据库实践。