#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:
#99024. Я не уверен, что они предлагают делать. Нужно ли мне обновляться до 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 немного отличаются, и он завершается с ошибкой.
Вы должны иметь возможность вставить строку с правильным форматом.