InfluxData Flux查询如何返回首次超17°水文数据的时间戳
解决方案
你当前运行的Flux查询实际已经返回了目标记录的所有属性,其中_time字段就是对应时间戳,面板默认只展示_value存储的温度测量值,所以看不到时间。你可以根据使用场景选以下任意一种方式实现需求:
方式一:不修改查询,直接调整面板配置
- 打开对应查询单元格的可视化配置面板
- 如果你用的是单值(Stat)类可视化组件,直接把取值字段从默认的
_value切换为_time即可;如果是表格类组件,找到列展示设置项,取消_value字段的展示勾选,将_time字段设为需展示的列 - 按需调整时间字段的显示格式,可选择适配年/月/日 时:分:秒等不同展示精度
该方式不需要改动现有可正常运行的查询逻辑,操作成本最低。
方式二:修改Flux查询,直接将时间戳作为返回值
如果需要让查询结果直接把时间戳作为输出值,在原有查询的first()步骤后增加字段映射逻辑即可,修改后的完整代码如下:
from(bucket: "hydroAPI") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "hydro") |> filter(fn: (r) => r["_field"] == "temperature") |> filter(fn: (r) => r["loc"] == "XXXX") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> filter(fn: (r) => r._value > 17 ) |> first() // 将时间戳映射为_value字段,替换原有温度值 |> map(fn: (r) => ({ r with _value: string(v: r._time), _field: "first_over_17_timestamp" })) |> yield(name: "first_record_time")
- 如果你需要Unix时间戳格式而非格式化时间字符串,将map逻辑中
_value的赋值改为int(v: r._time)即可,默认返回纳秒级时间戳,需要秒级时间戳可改为int(v: r._time) / 1000000000 - 同步修改
_field和yield名称可以避免和原有温度均值查询的结果混淆,减少面板识别字段出错的概率
内容的提问来源于stack exchange,提问作者KSPR
相关产品推荐
相关产品推荐

