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