如何使用jooq将带时区的时间戳插入hsqldb

6qftjkof  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(437)

我正在使用 HSQLDB 2.4.0 , jOOQ 3.7.1 , Scala 2.11.7 , Java 8 .
我想插入一个 java.time.OffsetDateTime 变成一个 TIMESTAMP WITH TIME ZONE 列中的列 HSQLDB 表格:

sql.insertInto(MY_TABLE)
    .columns(MY_TABLE.INSERTED_ON)
    .values(java.time.OffsetDateTime.now())
    .execute()

我得到以下例外:

org.hsqldb.HsqlException: data exception: invalid datetime format

我做错什么了?

2q5ifsrm

2q5ifsrm1#

hsqldb只有在按照sql标准格式化时,才能将字符串转换成带时区的时间戳。接受“2020-12-12 21:34:10.769000+2:00”这样的字符串。offsetdatetime的tostring方法的输出略有不同,因此失败。
您应该能够插入正确格式的字符串。

n53p2ov0

n53p2ov02#

如在https://github.com/jooq/jooq/issues/9174
出于向后兼容性的原因,我们仍然将jsr310类型绑定为大多数方言中的字符串,因为jdbc驱动程序没有立即采用它们。有一个挂起的特性请求传递jsr 310类型而不是字符串:#9902
imho,升级到最新版本的jooq将是最好的选择。
这里也提到了
jooq仍然将值转换为字符串表达式,比如“timestamp with time zone'2019-09-05 15:02:14.5015411+02:00”,而不是将其传递给jdbc驱动程序。
你可以试着插入 OffsetDateTime 格式化为符合指定格式的字符串,然后查看是否有效。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.nXXX");
String formatted = OffsetDateTime.now().format(formatter);
sql.insertInto(MY_TABLE)
    .columns(MY_TABLE.INSERTED_ON)
    .values(formatted)
    .execute()

相关问题