Проблема
В Oracle TRUNC перегружен и поддерживает обе функции:- числовые значения
- значения даты (например, усечение до дня, месяца и т. д.)
Код: Выделить всё
TRUNC(SYSDATE)
TRUNC(SYSDATE, 'MM')
TRUNC(123.456, 2)
- применяется только к числовым значениям.
Код: Выделить всё
TRUNC() - Для дат эквивалентом является DATE_TRUNC()
Код: Выделить всё
DATE_TRUNC('day', now())
TRUNC(123.456, 2)
Текущий обходной путь
Чтобы справиться с этой разницей, я реализовал собственное преобразование с помощью parserListener в jOOQ:- Определить использование TRUNC(date)
- Переписать его в oracle.trunc(...) через Расширение orafce
Код: Выделить всё
TRUNC(date_column)
Код: Выделить всё
oracle.trunc(date_column)
Проблема
Этот подход работает функционально, но он довольно дорог с точки зрения производительности, особенно при обработке большого количества запросов (например, при обработке статистики).Дополнительная проблема
Ключевой проблемой здесь является правильное сопоставление (
Код: Выделить всё
TRUNCОднако во время анализа SQL (например, через parserListener) информация о типе не обязательно доступна, что затрудняет выполнение надежного преобразования.
В результате этот подход кажется хрупким и потенциально дорогостоящим с точки зрения производительности.
Мобильная версия