Запрос InfluxDB 'Выберите где время> отметка времени - PullRequest
0 голосов
/ 20 февраля 2019

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

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

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

    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 нс, при входе в приставку приставки приращения 6 добавьте 6, и она станет 61540300800000 мс.

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

Есть идеи?

1 Ответ

0 голосов
/ 21 февраля 2019

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

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

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

Другие пункты:

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

Ссылка

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

...