Поведение Oracle TRUNC(дата) и PostgreSQL TRUNC(числовое) в jOOQ (3.19.6) — лучший подход, чем переписывание через parseJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Поведение Oracle TRUNC(дата) и PostgreSQL TRUNC(числовое) в jOOQ (3.19.6) — лучший подход, чем переписывание через parse

Сообщение Anonymous »

В настоящее время я работаю над переходом с Oracle Database на PostgreSQL, используя jOOQ (версия 3.19.6), и столкнулся с различиями в поведении функции TRUNC.

Проблема

В Oracle TRUNC перегружен и поддерживает обе функции:
  • числовые значения
  • значения даты (например, усечение до дня, месяца и т. д.)
Пример в Oracle:

Код: Выделить всё

TRUNC(SYSDATE)
TRUNC(SYSDATE, 'MM')
TRUNC(123.456, 2)
Однако в PostgreSQL:
  • применяется только к числовым значениям.
  • Для дат эквивалентом является DATE_TRUNC()
Пример в PostgreSQL:

Код: Выделить всё

DATE_TRUNC('day', now())
TRUNC(123.456, 2)

Текущий обходной путь

Чтобы справиться с этой разницей, я реализовал собственное преобразование с помощью parserListener в jOOQ:
  • Определить использование TRUNC(date)
  • Переписать его в oracle.trunc(...) через Расширение orafce
Так эффективно:

Код: Выделить всё

TRUNC(date_column)
становится:

Код: Выделить всё

oracle.trunc(date_column)

Проблема

Этот подход работает функционально, но он довольно дорог с точки зрения производительности, особенно при обработке большого количества запросов (например, при обработке статистики).
Дополнительная проблема
Ключевой проблемой здесь является правильное сопоставление ( vs DATE_TRUNC) зависит от базового типа данных выражения.
Однако во время анализа SQL (например, через parserListener) информация о типе не обязательно доступна, что затрудняет выполнение надежного преобразования.
В результате этот подход кажется хрупким и потенциально дорогостоящим с точки зрения производительности.

Вопрос

Есть ли более эффективный или идиоматический способ справиться с такой несовместимостью функций между базами данных в jOOQ?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»