时间语法
对于大多数SELECT
语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTC
到2262-04-11T23:47:16.854775806Z UTC
。对于包含GROUP BY time()
子句的SELECT
语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTC
到now()
。以下章节将详细介绍如何在SELECT
语句的WHERE
子句中指定其它的时间范围。
绝对时间
使用日期-时间字符串(date-time string)和epoch时间来指定绝对时间。
语法
SELECT_clause FROM_clause WHERE time <operator> ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [AND ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [...]]
语法描述
支持的操作符如下表所示。
= | 等于 |
---|---|
<> | 不等于 |
!= | 不等于 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
目前,TSDB For InfluxDB®不支持在WHERE子句中的绝对时间使用OR
,请查看FAQ文档获得更多相关信息。
rfc3339_date_time_string
YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ
.nnnnnnnnn
是可选的,如果没有指定的话,默认设为.000000000
。RFC3339格式的日期-时间字符串(RFC3339 date-time string)需要用单引号括起来。
rfc3339_like_date_time_string
YYYY-MM-DD HH:MM:SS.nnnnnnnnn
HH:MM:SS.nnnnnnnnn.nnnnnnnnn
是可选的,如果没有指定的话,默认设为00:00:00.000000000
。类似RFC3339格式的日期-时间字符串(RFC3339-like date-time string)需要用单引号括起来。
epoch_time
epoch时间是自1970年1月1日星期四00:00:00(UTC)以来所经过的时间。在默认情况下,TSDB For InfluxDB®假设所有epoch格式的时间戳都是以纳秒为单位。通过在epoch格式的时间戳末尾加上一个表示时间精度的字符,可以表示除纳秒外的时间精度。
基本运算
所有时间戳格式支持基本的算术运算。可以将带有时间精度的时间戳加上(+
)或者减去(-
)一个时间。请注意,InfluxQL需要用一个空格将+
或-
和时间戳隔开。
示例
用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
该查询返回时间戳在2015年8月18日00:00:00.000000000
和2015年8月18日00:12:00
之间的数据。第一个时间戳的纳米精度(.000000000
)是可选的。
请注意,RFC3339格式的日期-时间字符串需要用单引号括起来。
用类似RFC3339格式的日期-时间字符串指定一个时间范围
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18' AND time <= '2015-08-18 00:12:00'
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
该查询返回时间戳在2015年8月18日00:00:00
和2015年8月18日00:12:00
之间的数据。第一个日期-时间字符串没有包含时间,TSDB For InfluxDB®会假设时间是00:00:00
。
请注意,类似RFC3339格式的日期-时间字符串需要用单引号括起来。
用epoch格式的时间戳指定一个时间范围
> 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
该查询返回时间戳在2015年8月18日00:00:00
和2015年8月18日00:12:00
之间的数据。在默认情况下,TSDB For InfluxDB®假设epoch格式的时间戳以纳秒为单位。
用其它时间精度的epoch格式的时间戳指定一个时间范围
> 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
该查询返回时间戳在2015年8月18日00:00:00
和2015年8月18日00:12:00
之间的数据。时间戳末尾的s
表示该时间戳以秒为单位。
对类似RFC3339格式的日期-时间字符串进行基本运算
> SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-09-18T21:24:00Z' + 6m
name: h2o_feet
time water_level
---- -----------
2015-09-18T21:36:00Z 5.066
2015-09-18T21:42:00Z 4.938
该查询返回时间戳在2015年8月18日21:24:00
后6分钟之后的数据,即在2015年8月18日21:30:00
之后的数据。请注意,需要用空格分别将时间戳和+
、+
和6m
隔开。
对epoch格式的时间戳进行基本运算
> 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
2015-09-18T21:36:00Z 5.066
2015-09-18T21:42:00Z 4.938
该查询返回时间戳在2015年8月18日21:24:00
前6分钟之后的数据,即在2015年8月18日21:18:00
之后的数据。请注意,需要用空格分别将时间戳和-
、-
和6m
隔开。
相对时间
使用now()
查询时间戳相对于服务器本地时间戳的数据。
语法
SELECT_clause FROM_clause WHERE time <operator> now() [[ - | + ] <duration_literal>] [(AND|OR) now() [...]]
语法描述
now()
是在服务器上执行查询时该服务器的Unix时间。-
或+
和duration_literal
之间必须要用空格隔开。
支持的操作符如下表所示。
= | 等于 |
---|---|
<> | 不等于 |
!= | 不等于 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
duration_literal
u或µ | 微秒 |
---|---|
ms | 毫秒 |
s | 秒 |
m | 分钟 |
h | 小时 |
d | 天 |
w | 星期 |
示例
用相对时间指定时间范围
> SELECT "water_level" FROM "h2o_feet" WHERE time > now() - 1h
该查询返回过去一个小时内的数据。需要用空格分别将now()
和-
、-
和1h
隔开。
用绝对时间和相对时间指定时间范围
> SELECT "level description" FROM "h2o_feet" WHERE time > '2015-09-18T21:18:00Z' AND time < now() + 1000d
name: h2o_feet
time level description
---- -----------------
2015-09-18T21:24:00Z between 3 and 6 feet
2015-09-18T21:30:00Z between 3 and 6 feet
2015-09-18T21:36:00Z between 3 and 6 feet
2015-09-18T21:42:00Z between 3 and 6 feet
该查询返回时间戳在2015年9月18日21:18:00
和now()
之后的1000天之间的数据。需要用空格分别将now()
和+
、+
和1000d
隔开。
时间语法的常见问题
使用OR选择多个时间间隔
TSDB For InfluxDB®不支持在WHERE子句中使用OR
来指定多个时间间隔。若想获得更多相关信息,请查阅FAQ相关章节。
在带有GROUP BY time()的查询语句中,查询发生在now()之后的数据
对于大多数SELECT
语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTC
到2262-04-11T23:47:16.854775806Z UTC
。对于包含GROUP BY time()
子句的SELECT
语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTC
到now()
。
若想查询发生在now()
之后的数据,包含GROUP BY time()
子句的SELECT
语句必须在WHERE
子句中提供一个时间上限(upper bound)。
示例
使用CLI向数据库NOAA_water_database
中写入一个发生在now()
之后的数据点:
> INSERT h2o_feet,location=santa_monica water_level=3.1 1587074400000000000
运行一个带有GROUP BY time()
的查询,涵盖时间戳在2015-09-18T21:30:00Z
和now()
之后的180个星期之间的数据:
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-09-18T21:30:00Z' AND time <= now() + 180w GROUP BY time(12m) fill(none)
name: h2o_feet
time mean
---- ----
2015-09-18T21:24:00Z 5.01
2015-09-18T21:36:00Z 5.002
2020-04-16T22:00:00Z 3.1
注意:WHERE
子句必须提供一个时间上限来覆盖默认的now()
上限。以下查询仅仅是将时间下限(lower bound)重新设置为now()
,使得查询的时间范围在now()
和now()
之间,所以没有返回任何数据:
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= now() GROUP BY time(12m) fill(none)
>
配置返回的时间戳
CLI默认返回epoch格式的时间戳,并且精确到纳秒,可通过命令precision <format>
来指定其它的时间格式。HTTP API默认返回RFC3339格式的时间戳,可通过参数epoch
来指定其它的时间格式。
InfluxDB® is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB®.