Vertica VerticaDayTimeInterval 精度存储错误

2022-09-01 11:07:36

编辑:请指出,如果其他人没有看到这个问题,而我做错了什么。

我正在尝试通过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 位精度为 9 位)的 java.sql.Timestamp

Vertica JDBC 驱动程序支持 VerticaDateTimeInteval 的微秒(6 位精度)。

当您想在示例代码中指定精度为1,2或3时,我不知道您的意图是什么,但是,恕我直言,当您创建新的VerticaDateTimeInterval对象并且想要定义许多秒分数时,您有2个主要选项(这有意义):

  • 精度为 3,给定的分数数以毫秒为单位
  • 精度为 6,给定的分数数以微秒为单位。

精度为 1 时,分数数以十分之一秒为单位。精度为2,以百分之一秒为单位。精度为4,在1/10000秒。精度为5,在1/100000秒。

因此,当数据库返回查询结果时,它应该通知您返回对象的分数字段的整数内容的精度为 6(这意味着这是一个微秒数)。


答案 2