InfluxDB 中與時間相關的幾個概念: precision,duration,epoch_time

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章