【问题标题】:jOOQ fetched timestamp has no nanosecondsjOOQ 获取的时间戳没有纳秒
【发布时间】:2016-07-24 15:16:51
【问题描述】:

在使用 jOOQ 的 postgres 数据库中,当我获取具有定义为列的行时

timestamp without time zone

当我进行选择并获得值(由 jOOQ 获取到 java.sql.Timestamp 中)时,我看到纳秒丢失了。

例如,在我拥有的数据库中:

2016-04-04 15:14:10.970048

但是 jOOQ 返回一个带值的时间戳

2016-04-04 15:14:10.0

这是进一步比较的问题。我怎样才能防止这种情况发生?


更新 根据要求,我将提供更多详细信息。

在 Postgresql 中我有一个类型:

CREATE TYPE schema.my_type AS
(
  mt_page                  smallint,
  mt_active_from   timestamp without time zone,
);

我调用一个函数,使用例程:

DSLContext dsl = ....

MyTypeRecord [] records = Routines.myRoutine(dsl.configuration); 

那么,时间戳就不会没有纳米了

函数是:

CREATE OR REPLACE FUNCTION shop.myRoutine(
  OUT my_types schema.my_type[]
  )
  RETURNS schema.my_type[] AS
$BODY$
DECLARE
BEGIN
  BEGIN

          SELECT ARRAY(
            SELECT
                  ROW(a_id, a_timestamp)::schema.my_type
            FROM schema.article
          ) INTO my_types;
  END;
  RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 1000;

【问题讨论】:

  • 刚刚选择了ctx.select(val(Timestamp.valueOf("2016-04-04 15:14:10.970048"))).fetch() 并获得了正确的时间戳。你的 jOOQ 代码是什么样的?您能否提供更多信息来帮助重现此问题?
  • @LukasEder 已更新。希望有帮助
  • 哦,这是来自复合类型的数组。这改变了一切 :) 这些通过 JDBC 被序列化为字符串。很可能,那里出了点问题。将调查

标签: java postgresql jooq sql-timestamp


【解决方案1】:

这是 jOOQ 中的一个错误:https://github.com/jOOQ/jOOQ/issues/5193

jOOQ 在内部实现了复合类型反序列化算法,不幸的是,PostgreSQL 的 JDBC 驱动程序没有实现 SQLData 和相关 API 以支持开箱即用的复合类型。当前的实现 (jOOQ 3.7.3) 解析没有小数秒部分的时间戳。

作为一种解决方法,您可以实现自己的data type binding 来解决此问题。

【讨论】:

  • 这个错误修复会成为下一个版本的一部分吗?
  • @mat_boy:是的,already fixed
猜你喜欢
  • 1970-01-01
  • 2016-10-25
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2019-08-01
  • 2015-01-28
相关资源
最近更新 更多