时间语法

对于大多数SELECT语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTC2262-04-11T23:47:16.854775806Z UTC。对于包含GROUP BY time()子句的SELECT语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTCnow()。以下章节将详细介绍如何在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是可选的,如果没有指定的话,默认设为.000000000RFC3339格式的日期-时间字符串(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.0000000002015年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:002015年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:002015年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:002015年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:00now()之后的1000天之间的数据。需要用空格分别将now()++1000d隔开。

时间语法的常见问题

使用OR选择多个时间间隔

TSDB For InfluxDB®不支持在WHERE子句中使用OR来指定多个时间间隔。若想获得更多相关信息,请查阅FAQ相关章节。

在带有GROUP BY time()的查询语句中,查询发生在now()之后的数据

对于大多数SELECT语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTC2262-04-11T23:47:16.854775806Z UTC。对于包含GROUP BY time()子句的SELECT语句,默认的时间范围是从1677-09-21 00:12:43.145224194 UTCnow()

若想查询发生在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:00Znow()之后的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®.