全部产品
云市场
云游戏

时间语法

更新时间:2020-08-06 16:28:15

对于大多数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时间来指定绝对时间。

语法

  1. 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

  1. YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ

.nnnnnnnnn是可选的,如果没有指定的话,默认设为.000000000RFC3339格式的日期-时间字符串(RFC3339 date-time string)需要用单引号括起来。

rfc3339_like_date_time_string

  1. 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格式的日期-时间字符串指定一个时间范围

  1. > 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'
  2. name: h2o_feet
  3. time water_level
  4. ---- -----------
  5. 2015-08-18T00:00:00Z 2.064
  6. 2015-08-18T00:06:00Z 2.116
  7. 2015-08-18T00:12:00Z 2.028

该查询返回时间戳在2015年8月18日00:00:00.0000000002015年8月18日00:12:00之间的数据。第一个时间戳的纳米精度(.000000000)是可选的。

请注意,RFC3339格式的日期-时间字符串需要用单引号括起来。

用类似RFC3339格式的日期-时间字符串指定一个时间范围

  1. > SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18' AND time <= '2015-08-18 00:12:00'
  2. name: h2o_feet
  3. time water_level
  4. ---- -----------
  5. 2015-08-18T00:00:00Z 2.064
  6. 2015-08-18T00:06:00Z 2.116
  7. 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格式的时间戳指定一个时间范围

  1. > SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000000000000 AND time <= 1439856720000000000
  2. name: h2o_feet
  3. time water_level
  4. ---- -----------
  5. 2015-08-18T00:00:00Z 2.064
  6. 2015-08-18T00:06:00Z 2.116
  7. 2015-08-18T00:12:00Z 2.028

该查询返回时间戳在2015年8月18日00:00:002015年8月18日00:12:00之间的数据。在默认情况下,TSDB For InfluxDB®假设epoch格式的时间戳以纳秒为单位。

用其它时间精度的epoch格式的时间戳指定一个时间范围

  1. > SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000s AND time <= 1439856720s
  2. name: h2o_feet
  3. time water_level
  4. ---- -----------
  5. 2015-08-18T00:00:00Z 2.064
  6. 2015-08-18T00:06:00Z 2.116
  7. 2015-08-18T00:12:00Z 2.028

该查询返回时间戳在2015年8月18日00:00:002015年8月18日00:12:00之间的数据。时间戳末尾的s表示该时间戳以秒为单位。

对类似RFC3339格式的日期-时间字符串进行基本运算

  1. > SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-09-18T21:24:00Z' + 6m
  2. name: h2o_feet
  3. time water_level
  4. ---- -----------
  5. 2015-09-18T21:36:00Z 5.066
  6. 2015-09-18T21:42:00Z 4.938

该查询返回时间戳在2015年8月18日21:24:00后6分钟之后的数据,即在2015年8月18日21:30:00之后的数据。请注意,需要用空格分别将时间戳和++6m隔开。

对epoch格式的时间戳进行基本运算

  1. > SELECT "water_level" FROM "h2o_feet" WHERE time > 24043524m - 6m
  2. name: h2o_feet
  3. time water_level
  4. ---- -----------
  5. 2015-09-18T21:24:00Z 5.013
  6. 2015-09-18T21:30:00Z 5.01
  7. 2015-09-18T21:36:00Z 5.066
  8. 2015-09-18T21:42:00Z 4.938

该查询返回时间戳在2015年8月18日21:24:00前6分钟之后的数据,即在2015年8月18日21:18:00之后的数据。请注意,需要用空格分别将时间戳和--6m隔开。

相对时间

使用now()查询时间戳相对于服务器本地时间戳的数据。

语法

  1. 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 星期

示例

用相对时间指定时间范围

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

该查询返回过去一个小时内的数据。需要用空格分别将now()--1h隔开。

用绝对时间和相对时间指定时间范围

  1. > SELECT "level description" FROM "h2o_feet" WHERE time > '2015-09-18T21:18:00Z' AND time < now() + 1000d
  2. name: h2o_feet
  3. time level description
  4. ---- -----------------
  5. 2015-09-18T21:24:00Z between 3 and 6 feet
  6. 2015-09-18T21:30:00Z between 3 and 6 feet
  7. 2015-09-18T21:36:00Z between 3 and 6 feet
  8. 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()之后的数据点:

  1. > INSERT h2o_feet,location=santa_monica water_level=3.1 1587074400000000000

运行一个带有GROUP BY time()的查询,涵盖时间戳在2015-09-18T21:30:00Znow()之后的180个星期之间的数据:

  1. > 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)
  2. name: h2o_feet
  3. time mean
  4. ---- ----
  5. 2015-09-18T21:24:00Z 5.01
  6. 2015-09-18T21:36:00Z 5.002
  7. 2020-04-16T22:00:00Z 3.1

注意:WHERE子句必须提供一个时间上限来覆盖默认的now()上限。以下查询仅仅是将时间下限(lower bound)重新设置为now(),使得查询的时间范围在now()now()之间,所以没有返回任何数据:

  1. > SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= now() GROUP BY time(12m) fill(none)
  2. >

配置返回的时间戳

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®.