VerticaDayTimeInterval精度存储错误。

31

编辑:请指出其他人是否看到此问题,以及我是否做错了什么。

我正在尝试通过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


似乎有些东西正在删除前导0。rs.next在做什么,你是如何从表中获取这些数据的?方法可能是问题的原因。编辑:你的代码看起来正确,我认为问题是由于你从表中检索数据的方式引起的。 - sorifiend
还有一个想法可能完全没有帮助,但值得一试:不要使用 (VerticaDayTimeInterval)(rs.getObject(1));,而是尝试 rs.getObject(1, VerticaDayTimeInterval) - sorifiend
@sorifiend,很遗憾,这是不可能完成的。 - Zxcv Mnb
为什么你在使用八进制数字作为分钟参数?带有前导零的整数被视为八进制数字。也许Java类在这一点上感到困惑了。 - Joshua K
@JoshuaK,去掉前导0并没有改变输出结果,因此八进制转换不是问题。 - Zxcv Mnb
1个回答

1
精度始终是数据表示的指导方针。 数据始终以特定的精度存储,这是驱动程序(和引擎)支持的最大精度。 用户用于插入数据的精度不会存储在数据库中,因为它仅在表示数据时有用。
经典的JDBC驱动程序支持java.sql.Timestamp纳秒(9位数字的精度)
Vertica JDBC驱动程序支持VerticaDateTimeInteval微秒(6位数字的精度)
我不知道您在样例代码中指定1、2或3的精度时确切的意图是什么,但是,在我看来,当您创建新的VerticaDateTimeInterval对象并想要定义秒分数时,您有两个主要选项(有意义):
  • 精度为3,并且给定的分数数字将以毫秒为单位。
  • 精度为6,并且给定的分数数字将以微秒为单位。

精度为1时,小数的数量是十分之一秒。 精度为2时,是百分之一秒。 精度为4时,是万分之一秒。 精度为5时,是十万分之一秒。

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


如果您可以访问Vertica设置,请确认是否看到值为1-6(包括值为3)的问题。 - Zxcv Mnb
很遗憾,我没有访问Vertica设置的权限。我想说的是,您不需要存储小数精度。而且它也没有被存储。 - sanastasiadis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接