InfluxDb 时间范围查询总结

简介: 问题:数据查不出来,查询数据少了 8 小时 从 InfluxDB查询数据发现当前数据查不出来,分析发现少了 8 小时。 所以在查询语句中减去了 8 小时,虽然数据可以查出来了,但是 group by 时,显示的数据会多一天。

问题:数据查不出来,查询数据少了 8 小时

从 InfluxDB查询数据发现当前数据查不出来,分析发现少了 8 小时。 所以在查询语句中减去了 8 小时,虽然数据可以查出来了,但是 group by 时,显示的数据会多一天。

先了解一下时区有助于理解下面查询结果, RFC3339详细定义了互联网上日期/时间的偏移量表示:

2017-12-08T00:00:00.00Z
这个代表了UTC时间的2017年12月08日零时:

2017-12-08T00:08:00.00+08:00

东八区的本地时间比零时区的本地时间快了8个小时。
在后台管理系统上输入的是东八区时间。

查了一下代码是这么写的’2019-10-18T00:00:00Z’,这样比实际时间多了 8 小时。通常是把查询条件减去8 小时就大吉大利了:

SELECT count(user_id_val) FROM user_day where time >= '2019-10-18T00:00:00Z' and time < '2019-10-23T00:00:00Z' group by time(1d)
name: user_day
time count
---- -----
2019-10-18T00:00:00Z 7522
2019-10-19T00:00:00Z 7355
2019-10-20T00:00:00Z 7740
2019-10-21T00:00:00Z 5997
2019-10-22T00:00:00Z 5430
减去 8 小时候后查询的结果如下:

SELECT count(user_id_val) FROM user_day where time >= '2019-10-17T16:00:00Z' and time < '2019-10-22T16:00:00Z' group by time(1d)
name: user_day
time count
---- -----
2019-10-17T00:00:00Z 7641
2019-10-18T00:00:00Z 7522
2019-10-19T00:00:00Z 7355
2019-10-20T00:00:00Z 7740
2019-10-21T00:00:00Z 5997
2019-10-22T00:00:00Z 0
显示的结果中,最后一天没有数据,误以为错了,此处省略……… 最后一天显示 0,终于知道那个叫晕的小伙伴为什么把结果减了 1.这样只是把 显示 零的问题消除了,导致结果偏移了一天。 既然减去了8 小时显示结果中的日期也是少了 8 小时,加上就自然对了。 感觉这样不完美,压根就不想让这个多余的 0 出现。因为查询的调条件跨越了 8 小时导致查询的结果比预期的多了天。

下面是用东八区格式查询的数据与R3339 查询的结果一样。都是因为跨越了8 小时导致多查了一天:

SELECT count(user_id_val) FROM user_day where time >= '2019-10-18T00:00:00+08:00' and time < '2019-10-23T00:00:00+08:00' group by time(1d)
name: user_day
time count
---- -----
2019-10-17T00:00:00Z 7641
2019-10-18T00:00:00Z 7522
2019-10-19T00:00:00Z 7355
2019-10-20T00:00:00Z 7740
2019-10-21T00:00:00Z 5997
2019-10-22T00:00:00Z 0
找到了原因如何查询呢?那个叫晕的小伙伴提供了如下查询方式,influxddb 查询时指定时区。大吉大利!:

SELECT count(user_id_val) FROM user_day where time >= '2019-10-18T00:00:00+08:00' and time < '2019-10-23T00:00:00+08:00' group by time(1d) TZ('Asia/Shanghai')
name: user_day
time count
---- -----
2019-10-18T00:00:00+08:00 7641
2019-10-19T00:00:00+08:00 7522
2019-10-20T00:00:00+08:00 7355
2019-10-21T00:00:00+08:00 7740
2019-10-22T00:00:00+08:00 5997
本地时间只包括当前的时间,不包含任何时区信息。同一时刻,东八区的本地时间比零时区的本地时间快了8个小时。在不同时区之间交换时间数据,除了用纯数字的时间戳,还有一种更方便人类阅读的表示方式:标准时间的偏移量表示方法。

RFC3339详细定义了互联网上日期/时间的偏移量表示:

2017-12-08T00:00:00.00Z
这个代表了UTC时间的2017年12月08日零时:

2017-12-08T00:08:00.00+08:00
时区知识点
这个代表了同一时刻的,东八区北京时间(CST)表示的方法 上面两个时间的时间戳是等价的。两个的区别,就是在本地时间后面增加了时区信息。Z表示零时区。+08:00表示UTC时间增加8小时。 这种表示方式容易让人疑惑的点是从标准时间换算UTC时间。以CST转换UTC为例,没有看文档的情况下,根据 +08:00 的结尾,很容易根据直觉在本地时间再加上8小时。正确的计算方法是本地时间减去多增加的8小时。+08:00减去8小时才是UTC时间,-08:00加上8小时才是UTC时间。

目录
相关文章
|
NoSQL MongoDB
11 MongoDB - 数据查询(统计个数)
11 MongoDB - 数据查询(统计个数)
1069 0
|
时序数据库
influxDB时序数据库2.0FLUX查询语法使用记录
influxDB时序数据库2.0FLUX查询语法使用记录
|
缓存 NoSQL SQL
cassandra 查询超时
cassandra count 超时及建议解决方式
2932 0
|
NoSQL MongoDB
mongodb 分组查询、指定时间段查询
mongodb 分组查询、指定时间段查询
|
8月前
|
存储 SQL 数据库
influxdb 连续查询使用总结
influxdb 连续查询使用总结
272 0
|
9月前
|
时序数据库
时序数据库工具grafana里的$timeFilter查询1个小时内的数据如何写查询条件
【6月更文挑战第24天】时序数据库工具grafana里的$timeFilter查询1个小时内的数据如何写查询条件
1037 0
|
10月前
|
存储 Java
elasticsearch 如果按照日期进行筛选
如果你需要按照日期进行筛选,你可以使用 Elasticsearch 的范围查询来实现。以下是一个示例代码,演示如何在 Java 中进行日期范围查询: ```java import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.Req
275 7
|
10月前
|
JSON NoSQL MongoDB
mongodb导出聚合查询的数据
mongodb导出聚合查询的数据
|
10月前
|
存储 缓存 Java
Elasticsearch 8.X 聚合查询下的精度问题及其解决方案
Elasticsearch 8.X 聚合查询下的精度问题及其解决方案
254 0
|
10月前
|
存储 数据挖掘 数据库
InfluxDB的连续查询与数据聚合技术详解
【4月更文挑战第30天】InfluxDB的连续查询(CQ)功能用于自动定时聚合时间序列数据,适用于数据降采样、实时分析和告警通知等场景。CQ使用InfluxQL编写,例如,每1小时对`cpu_usage`测量值计算主机的平均CPU使用率并存入`cpu_usage_hourly`。InfluxDB提供多种聚合函数如`MEAN()`, `MAX()`, 支持滑动窗口聚合等复杂操作,助力时间序列数据分析和趋势预测。通过CQ,用户能高效管理和利用时间序列数据信息。