InfluxDB CQ时间偏移
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提前执行,如果想要延后执行将偏移量设置成整数。按照其它时间聚合的时候也可以适用这种操作。