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
将是最好的选择。