Запрос InfluxDB'Выберите где время> отметка времени

У меня есть Java-приложение, которое отправляет измерения в базу данных InfxDB.

Я добавляю очки в мою базу данных Infliff. Точки, которые я добавляю каждый раз при запуске моей программы, имеют текущую метку времени.

Вот как я добавляю свои точки (построение измерений):

    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)

Я заметил, что также учитываются результаты предыдущих отметок времени, даже если я делаю отметку времени> отметка времени. И когда я делаю>> вместо>=, он учитывает только последние. Я также заметил, что для предыдущей временной метки, например, если у меня есть такая временная метка, как 1540300800000 нс, при входе в flowxdb добавляется 6, и она становится 61540300800000 мс.

Я действительно не понимаю, что происходит.

Есть идеи?

1 ответ

Решение

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, современный API даты и времени Java.

Что пошло не так в вашем коде

Хотя я не воспроизводил и не проверял, я полагаю, что вы перепутали миллисекунды, 10^-3 секунды, и наносекунды, 10^-9 секунд. date.getTime() дает вам миллисекунды с эпохи, но вы передаете число в time(timestamp, TimeUnit.NANOSECONDS), Если я беру начало дня сегодня (21 февраля) в своем часовом поясе (CET) и использую миллисекунды с той эпохи как наносекунды, я получаю 1970-01-01T00:25:50.703600Z, Итак, я полагаю, вы получили все через некоторое время.

Другие моменты:

  • Классы Date а также SimpleDateFormat то, что вы использовали, плохо разработано и давно устарело, поэтому я советую вам избегать их. С современным java.time работать намного приятнее.
  • Форматирование даты и времени в строку даты и ее повторный анализ - это обходной путь для поиска начала дня.

Ссылка на сайт

Учебное пособие по Oracle: Date Time, объясняющее, как использовать java.time.

Другие вопросы по тегам