Подтвердить что ты не робот

Вертикальная точность VerticaDayTimeInterval хранится неправильно

РЕДАКТИРОВАТЬ: Пожалуйста, укажите, если другие не видят эту проблему, и я делаю что-то неправильно.

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

dayInt = new VerticaDayTimeInterval(10, 10, 01, 8, 2, 1, false) ; ((VerticaPreparedStatement) pstmt).setObject(1, dayInt) ; pstmt.addBatch() ; System.out.println(dayInt.toString());
dayInt = new VerticaDayTimeInterval(10, 10, 02, 7, 3, 2, false) ; ((VerticaPreparedStatement) pstmt).setObject(1, dayInt) ; pstmt.addBatch() ; System.out.println(dayInt.toString());
dayInt = new VerticaDayTimeInterval(10, 10, 03, 6, 43, 3, false) ; ((VerticaPreparedStatement) pstmt).setObject(1, dayInt) ; pstmt.addBatch() ; System.out.println(dayInt.toString());

вывод таблицы

DayInt       
-------------------
10 10:03:49.000211
11 07:00:00.0002
9 09:09:05.000005
(3 rows)

восстановление и печать строк с помощью набора результатов.

for (int x=1 ; rs.next() ; ++x) {
    VerticaDayTimeInterval dti = (VerticaDayTimeInterval)(rs.getObject(1));
    System.out.println("vertica object tostring "+dti.toString()+" frac "+dti.getFraction()+" precision "+dti.getPrecision());
}

Выход

vertica object tostring 10 10:03:49.211000 frac 211000 precision 6
vertica object tostring 11 07:00:00.200000 frac 200000 precision 6
vertica object tostring 9 09:09:05.500000 frac 500000 precision 6

Мой код похож на https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/ConnectingToHPVertica/ClientJDBC/UsingIntervalsWithJDBC.htm

4b9b3361

Ответ 1

Прецизионность всегда является ориентиром для представления данных. Данные всегда хранятся с определенной точностью, что является максимальной точностью, поддерживаемой драйвером (и, конечно же, двигателем). Точность, которая была использована пользователем для вставки данных, хранится в базе данных не, поскольку она полезна только при представлении данных.

Классические драйверы JDBC поддерживают до наносекунд (точность 9 цифр) для java.sql.Timestamp.

Драйвер Vertica JDBC поддерживает до микросекунд (точность 6 цифр) для VerticaDateTimeInteval.

Я не знаю, каковы ваши намерения, когда вы хотите указать точность 1, 2 или 3 в вашем примере кода, но IMHO, когда вы создаете новый объект VerticaDateTimeInterval, и вы хотите определить количество секунд фракций, у вас есть 2 основных варианта (что имеет смысл):

  • точность 3, а число дробей будет в миллисекундах
  • точность 6, а число дробей будет в микросекундах.

С точностью 1 число фракций составляет десятые доли секунды. С точностью 2, находится в сотых долях секунды. С точностью 4, составляет 1/10000 секунд. С точностью 5, составляет 1/100000 секунд.

Соответственно, когда база данных возвращает результат запроса, она должна сообщить вам, что целочисленное содержимое поля фракций возвращаемого объекта имеет точность 6 (это означает, что это количество микросекунд).