4

我需要开发一个 InfluxDB 时间序列。时间序列需要包含以下信息:

  • time - 记录数据的时间。这将使用 InfluxDB 时间字段。
  • value - 时间序列的值。一个简单的整数。
  • date - 与值关联的单独日期。此日期与“时间”字段无关。它将用于帮助缩小查询范围。

我目前的思路是将上面的“日期”字段保存为时间序列中的一个单独的“列”,这样我就可以使用“where”子句来过滤使用该日期的数据。但是,我正在为如何表示这一点而苦苦挣扎。InfluxDB 是否支持任何类型的日期或日期/时间字段?对于“时间”字段,它似乎只使用毫秒。但是,如果我在具有不同名称的字段中尝试相同的操作,则正常时间查询不起作用。例如:

select * from myseries where time > now() - 1d

上面的查询可以正常工作。

对比

select * from myseries where date > now() - 1d

此查询将失败并出现错误,因为它似乎不知道如何将“日期”视为时间值。

在这种情况下,日期是否有更好的表示?

4

1 回答 1

3

InfluxDB 数据类型只能是以下之一:浮点数、整数、布尔值或字符串。该time字段是一个特殊的例外。

您可以对日期字段使用表示 count-since-epoch 的整数。不过,像 now() 这样的便捷功能似乎并不适用(使用 v0.13):

insert test_dates date_int=1573405622000000000i,desc="years from now"
insert test_dates date_int=1373405661000000000i,desc="years ago"

now()

select * from test_dates where date_int > now()

给出:

name: test_dates

time                    date_int                desc 
1473404302801938064     1573405622000000000     years from now
1473404315927493772     1373405661000000000     years ago

和:

select * from test_dates where date_int < now()

给出:

name: test_dates

time                    date_int                desc
1473462286404084162     1573405622000000000     years from now
1473462286408231540     1373405661000000000     years ago

似乎每一个date_int都以某种方式大于小于now()

因此,如果您使用整数,比较不是语法错误,但不会按照我们想要的方式工作。

解决此问题的一种方法是在前端应用程序中创建您自己的日期到整数的转换。然后前端的日期比较是 InfluxDB 中的 int 比较。笨重,但这些是我们拥有的数据类型。

存储在 InfluxDB 中的日期可以是单个基于 epoch 的 int,或者在 InfluxDB 中存储年、月、日的单独 int 字段。在后一种情况下,查询更大更慢,但更容易阅读和调试。

祝你好运!

于 2016-09-09T07:36:18.583 回答