Java 如何使用JOOQ将带时区的时间戳插入HSQLDB

Java 如何使用JOOQ将带时区的时间戳插入HSQLDB,java,scala,datetime,hsqldb,jooq,Java,Scala,Datetime,Hsqldb,Jooq,我使用的是hsqldb2.4.0,jOOQ 3.7.1,scala2.11.7,java8 我正在尝试将java.time.OffsetDateTime插入HSQLDB表中带有时区的时间戳列中: sql.insertInto(MY_TABLE) .columns(MY_TABLE.INSERTED_ON) .values(java.time.OffsetDateTime.now()) .execute() 我得到以下例外情况: org.hsqldb.HsqlExcept

我使用的是
hsqldb2.4.0
jOOQ 3.7.1
scala2.11.7
java8

我正在尝试将
java.time.OffsetDateTime
插入
HSQLDB
表中带有时区的
时间戳
列中:

sql.insertInto(MY_TABLE)
    .columns(MY_TABLE.INSERTED_ON)
    .values(java.time.OffsetDateTime.now())
    .execute()
我得到以下例外情况:

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

我做错了什么?

HSQLDB只有在按照SQL标准格式化时,才能将字符串转换为带时区的时间戳。接受诸如“2020-12-12 21:34:10.769000+2:00”之类的字符串。OffsetDateTime的toString方法的输出略有不同,因此失败


您应该能够插入格式正确的字符串。

HSQLDB仅当根据SQL标准进行格式化时,才能将字符串转换为带时区的时间戳。接受诸如“2020-12-12 21:34:10.769000+2:00”之类的字符串。OffsetDateTime的toString方法的输出略有不同,因此失败

您应该能够插入格式正确的字符串。

如中所述

出于向后兼容性的原因,我们仍然绑定JSR310类型 作为大多数方言中的字符串,JDBC驱动程序还没有采用它们 马上。有一个挂起的特性请求要通过JSR310 键入而不是字符串:


IMHO,升级到最新版本的jOOQ将是最好的选择

这里也提到了

jOOQ仍然将值转换为类似“timestamp”的字符串表达式 时区为“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()
如在

出于向后兼容性的原因,我们仍然绑定JSR310类型 作为大多数方言中的字符串,JDBC驱动程序还没有采用它们 马上。有一个挂起的特性请求要通过JSR310 键入而不是字符串:


IMHO,升级到最新版本的jOOQ将是最好的选择

这里也提到了

jOOQ仍然将值转换为类似“timestamp”的字符串表达式 时区为“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()

有趣!我在这里没有发现任何问题。由于
hsqldb2.4.0
提供了对带时区的
时间戳的支持,相应的Java类型实际上是
Java.TIME.OffsetDateTime
。但是,我不知道
jOOQ
。我还想知道为什么这个问题会有接近票和否决票。我已经验证了,如果我将列类型更改为
varchar
,我可以插入一个字符串值……可能,我已经找到了原因。检查其中的内容:
出于向后兼容性的原因,我们仍然在大多数方言中将JSR310类型绑定为字符串,因为JDBC驱动程序没有立即采用它们。有一个挂起的特性请求要传递JSR 310类型而不是字符串:
我不确定他们建议做什么。我必须升级到jOOQ 3.14吗?嗯,升级到最新版本的
jOOQ
将是最好的选择。很有趣!我在这里没有发现任何问题。由于
hsqldb2.4.0
提供了对带时区的
时间戳的支持,相应的Java类型实际上是
Java.TIME.OffsetDateTime
。但是,我不知道
jOOQ
。我还想知道为什么这个问题会有接近票和否决票。我已经验证了,如果我将列类型更改为
varchar
,我可以插入一个字符串值……可能,我已经找到了原因。检查其中的内容:
出于向后兼容性的原因,我们仍然在大多数方言中将JSR310类型绑定为字符串,因为JDBC驱动程序没有立即采用它们。有一个挂起的特性请求要传递JSR 310类型而不是字符串:
我不确定他们建议做什么。我必须升级到jOOQ 3.14吗?我想,升级到最新版本的
jOOQ
将是最好的选择。