Поведение 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)

Проблема

Этот подход работает функционально, но он довольно затратен с точки зрения производительности, особенно при обработке большого количества запросов (например, при обработке статистики).

Вопрос

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

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