Вертикальная точность 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
Ответы
Ответ 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 (это означает, что это количество микросекунд).