Запрос 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.