Как вставить ВРЕМЕННУЮ МЕТКУ С ЧАСОВЫМ ПОЯСОМ в HSQLDB с помощью JOOQ

#java #scala #datetime #hsqldb #jooq

#java #scala #дата и время #hsqldb #jooq

Вопрос:

Я использую HSQLDB 2.4.0 , jOOQ 3.7.1 , Scala 2.11.7 , Java 8 .

Я пытаюсь вставить a 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
 

Что я делаю не так?

Комментарии:

1. Интересно! Я не нахожу здесь ничего плохого. Поддержка TIMESTAMP WITH TIME ZONE доступна с тех пор HSQLDB 2.4.0 , и соответствующий тип Java действительно java.time.OffsetDateTime есть. Однако я не знаю jOOQ . Мне также интересно, почему этот вопрос может закрыть голосование и отклонить голосование.

2. Я проверил, что могу вставить строковое значение, если я изменю тип столбца на varchar

3.Вероятно, я нашел причину. Проверьте github.com/jOOQ/jOOQ/issues/9174 который гласит: For backwards compatibility reasons, we're still binding JSR 310 types as strings in most dialects, as JDBC drivers haven't adopted them immediately. There's a pending feature request to pass the JSR 310 type instead of the string: #9902

4. Я не уверен, что они предлагают делать. Нужно ли мне обновляться до jOOQ 3.14?

5. ИМХО, обновление до последней версии jOOQ было бы лучшим выбором.

Ответ №1:

Как упоминалось в https://github.com/jOOQ/jOOQ/issues/9174

По соображениям обратной совместимости мы по-прежнему привязываем типы JSR 310 как строки на большинстве диалектов, поскольку драйверы JDBC не приняли их сразу. Существует ожидающий запрос функции на передачу типа JSR 310 вместо строки: #9902

ИМХО, обновление до последней версии jOOQ было бы лучшим выбором.

Это также упоминается там

jOOQ по-прежнему преобразует значение в строковое выражение типа «временная метка с часовым поясом ‘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()
 

Ответ №2:

HSQLDB может преобразовать строку в ВРЕМЕННУЮ МЕТКУ С ЧАСОВЫМ ПОЯСОМ только при форматировании в соответствии со стандартом SQL. Строка , такая как ‘2020-12-12 21:34:10.769000 2:00’ принимается. Выходные данные метода toString для OffsetDateTime немного отличаются, и он завершается с ошибкой.

Вы должны иметь возможность вставить строку с правильным форматом.