InfluxDB 中与时间相关的几个概念: precision,duration,epoch_time

文章目录

  • 1 UTC 时间
  • 2 precision[ns,u,ms,s,m,h]
  • 3 epoch_time, duration

InfluxDB 作为时间序列数据库,在处理 时间 数据时,有特殊的机制和规范,在使用时需要注意。

1 UTC 时间

UTC 时间就是世界标准时间。

UTC 时间戳就是以 1970-01-01T00:00:00 为起点的毫秒数,不考虑闰秒。时间戳不分时区,在任意时间点,不同时区的 UTC 时间戳是相同的。

时间戳 0 对应的时刻是:Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)

时间戳在转换为日期时,会根据本地时区,转换为不同的日期值。

1970 年之前的日期对应的时间戳为负数,比如 Mon Jan 01 1900 08:00:00 GMT+0805 (中国标准时间) 对应的时间戳为 -2208989143000

2 precision[ns,u,ms,s,m,h]

在写入和读取 influxdb 中的数据时,时间戳默认单位是纳秒,可以通过 precision 参数来指定为其他格式,比如 rfc3339 (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ), h (小时), m (分钟), s (秒), ms (毫秒), u (微妙), ns (纳秒)

1、使用 curl 来请求写入时,通过 precision 指定时间戳单位:

curl -i -XPOST "http://localhost:8086/write?db=mydb&precision=s" --data-binary 'mymeas,mytag=1 myfield=90 1463683075'

这样,命令后面的时间戳数据 1463683075,会按照秒来解析。

如果不指定 precision,默认会按照纳秒来解析,就需要将 1463683075 转换为 1463683075000000000

2、命令行模式中指定 precision:

$ influx -precision ms

这样,所有在该命令窗口中执行的写入和查询语句对应的时间戳单位,都变为毫秒。

3、-execute 命令中指定 precision:

$ influx -execute 'SELECT * FROM "h2o_feet" LIMIT 3' -database="NOAA_water_database" -precision=rfc3339
name: h2o_feet
--------------
time			               level description	    location	     water_level
2015-08-18T00:00:00Z	 below 3 feet		        santa_monica	 2.064
2015-08-18T00:00:00Z	 between 6 and 9 feet  coyote_creek  8.12
2015-08-18T00:06:00Z	 between 6 and 9 feet  coyote_creek  8.005

3 epoch_time, duration

在 InfluxDB Select 语句中, epoch 值就是时间戳,只不过 epoch 有更丰富的语义,使用起来更方便灵活。

now() : 本地服务器对应的纳秒时间戳

1、epoch

epoch 0 (1970-01-01T00:00:00Z)常被用来表示无意义的时间戳,也就是 null。比如,当请求的结果中不包含时间戳时,time 值就会置为 0:

> SELECT MEAN("index") FROM "h2o_quality" GROUP BY location,randtag

name: h2o_quality
tags: location=coyote_creek, randtag=1
time                  mean
----                  ----
1970-01-01T00:00:00Z  50.69033760186263

name: h2o_quality
tags: location=coyote_creek, randtag=2
time                   mean
----                   ----
1970-01-01T00:00:00Z   49.661867544220485

name: h2o_quality
tags: location=coyote_creek, randtag=3
time                   mean
----                   ----
1970-01-01T00:00:00Z   49.360939907550076

name: h2o_quality
tags: location=santa_monica, randtag=1
time                   mean
----                   ----
1970-01-01T00:00:00Z   49.132712456344585

2、duration

duration = integer + duration unit: 用来指定一段时间长度。

duration units = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .

在 InfluxDB 中,配置数据库的 Retention Policy 中会用到 duration,比如:

-- Create a retention policy.
CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2

-- Create a retention policy and set it as the DEFAULT.
CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2 DEFAULT

-- Create a retention policy and specify the shard group duration.
CREATE RETENTION POLICY "10m.events" ON "somedb" DURATION 60m REPLICATION 2 SHARD DURATION 30m

在 select 语句中也会用到 duration:

SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')
SELECT MEAN(value) FROM cpu GROUP BY time(10m)
SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' WHERE time > 24043524m - 6m

3、epoch_time

epoch time 就是 UTC 时间戳,默认单位为纳秒,可以通过 epoch_time 值后面跟 duration unit 来指定 precision。epoch_time 支持基本的算术运算,比如 +-,特别需要注意的是,influxQL 要求运算符与 epoch_time 之间要有空格。

time format 为 rfc3339:

> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00.000000000Z' AND time <= '2015-08-18T00:12:00Z'

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
2015-08-18T00:12:00Z   2.028

没有指定 duration unit,默认为纳秒:

> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000000000000 AND time <= 1439856720000000000

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
2015-08-18T00:12:00Z   2.028

通过添加 duration unit 来指定 precision 为秒:

> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000s AND time <= 1439856720s

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
2015-08-18T00:12:00Z   2.028

对 epoch_time 进行简单的运算:

> SELECT "water_level" FROM "h2o_feet" WHERE time > 24043524m - 6m

name: h2o_feet
time                   water_level
----                   -----------
2015-09-18T21:24:00Z   5.013
2015-09-18T21:30:00Z   5.01

使用 now() 函数来指定相对时间:

> SELECT "water_level" FROM "h2o_feet" WHERE time > now() - 1h

你可能感兴趣的:(InfluxDB 中与时间相关的几个概念: precision,duration,epoch_time)