InfluxDB的存储格式都是UTC时间,所以呢,查询出来的结果会跟咱们东八区差8小时。在CQ中如果出现了按照天(及以上单位)查询的时候最终的聚合时间是UTC的0点,这个时候如果继续使用UTC时间是没问题的,但是一旦前端按照东八区显示就会每天差了8小时的值。

以一天为例

CQ的逻辑是从0点往前找24个小时,将这24个小时的时间聚合在一起,然后把时间设置为24小时之前的那个0点。最终的结果就是昨天的0点有一个值。描述起来有些绕,自己动手画个数轴就知道了。

如下CQ:

CREATE CONTINUOUS QUERY cq_day_scan ON mydb BEGIN SELECT sum(amount) AS amount INTO mydb.autogen.day_scan FROM mydb.rp_90d.scan GROUP BY *, time(1d) END

1

如果是8月9号执行,则最终的结果:

time amount Key type statusCode

2018-08-08T00:00:00Z 3276 "test_key" "1" "0"

123

大家看上面的时间是UTC时间的0点,其聚合范围表达式为:

time >= 2018-08-08T00:00:00Z and time < 2018-08-09T00:00:00Z

1

换算成东八区的表达式:

time >= 2018-08-08 08:00:00 and time < 2018-08-09 08:00:00

1

上面格式有些不太合理,具体意思就是,它的聚合范围实际上是昨天的早8点到今天的早8点,也就是说昨天的0点到昨天的8点之间的数据都被聚合到前天了。同样今天的前8小时的数据被聚合到昨天了。

所以,如果想要按照东八区来执行就要做一些设置,让执行时间提前8小时执行,修改后的CQ如下:

CREATE CONTINUOUS QUERY cq_day_scan ON mydb BEGIN SELECT sum(amount) AS amount INTO mydb.autogen.day_scan FROM mydb.rp_90d.scan GROUP BY *, time(1d,-8h) END

1

这里做了8个小时的时间偏移,让CQ提前执行,如果想要延后执行将偏移量设置成整数。按照其它时间聚合的时候也可以适用这种操作。

相关文章