InfluxDB' 请求 Select where time > timestamp

InfluxDB' request Select where time > timestamp

我有一个 java 应用程序可以将测量结果发送到 influxDB 数据库。

我正在我的 influxdb 数据库中添加点。 每次我的程序 运行 具有当前时间戳时我添加的点。

这是我加分的方式(测量建筑):

    BatchPoints batchPoints;

    Date date = new Date();

    String beginofday = Constant.simpledateFormat.format(date);

    date = Constant.simpledateFormat.parse(beginofday);

    long timestamp = date.getTime();

    //adding points
    for buildings ... do
    Point point = Point.measurement("building").tag(tagsToAdd).fields(fieldsToAdd)
                        .time(timestamp, TimeUnit.NANOSECONDS).build();

    batchPoints.point(point);

我的问题是,当我用这样的请求请求我的数据库时:

select count(tag) from building where time > (my timestamp)

我注意到以前的时间戳结果也被计算在内,即使我正在做 time>timestamp。 当我执行 > 而不是 >= 时,它只计算最后一个。 我还注意到,对于前一个时间戳,例如,如果我有这样的时间戳 1540300800000 ns,influxdb 在开头添加 6,它变成 61540300800000 ms。

我真的不明白这是怎么回事。

有什么想法吗?

java.time

    ZoneId zone = ZoneId.systemDefault();
    Instant beginofday = LocalDate.now(zone).atStartOfDay(zone).toInstant();

    long timestamp = beginofday.toEpochMilli();

    //adding points
    for buildings ... do
    Point point = Point.measurement("building").tag(tagsToAdd).fields(fieldsToAdd)
                        .time(timestamp, TimeUnit.MILLISECONDS).build();

我正在使用 java.time,现代 Java 日期和时间 API。

你的代码出了什么问题

虽然我没有复现和测试,但我相信你混淆了毫秒、10^-3秒和纳秒、10 ^-9 秒。 date.getTime() 给你自纪元以来的毫秒数,但你在 time(timestamp, TimeUnit.NANOSECONDS) 中传递数字。如果我今天(2 月 21 日)在我的时区 (CET) 开始一天,并使用自纪元以来的毫秒数作为纳秒,我得到 1970-01-01T00:25:50.703600Z。所以我假设你在那个时间点之后得到了一切。

其他要点:

  • 你用的类 DateSimpleDateFormat 设计很差,已经过时了,所以我建议你避免使用它们。现代 java.time 更好用。
  • 将您的日期时间格式化为日期字符串并将其解析回来是寻找一天开始的弯路。

Link

Oracle tutorial: Date Time 解释如何使用 java.time.