У меня есть столбец даты CUR_DATE
в типе данных NUMBER (10) (20210821) в БД, и когда я запускаю некоторые выполнения с преобразованием, у меня возникают очень серьезные проблемы со временем работы.
напр. Мне нужно получить данные за последние 2 месяца с текущего дня, поэтому я использую подобное преобразование в своем предложении WHERE:
and trunc(to_date(CUR_DATE,'yyyymmdd'),'mm') >= add_months(trunc(sysdate,'mm'),-1)
и если я не меняю тип даты, конечно, он работает быстрее
and CUR_DATE >= 20220201
Так что, может быть, будет решение, которое позволит мне выполнять данные за последние два месяца?
Сделайте наоборот:
and cur_date >= to_number(to_char(add_months(trunc(sysdate, 'mm'), -1), 'yyyymmdd'))
если вы должны. Почему? Потому что, я полагаю, в столбце cur_date
есть индекс. Когда вы возиться с этим (применяете различные функции), индекс больше не используется. Однако вы мог создаете индекс на основе функций.
SQL> select to_number(to_char(add_months(trunc(sysdate, 'mm'), -1), 'yyyymmdd')) val from dual;
VAL
----------
20220201
SQL>
Что вам действительно нужно сделать, так это хранить даты в столбцах типа DATE
, а не NUMBER
.
похоже, это может быть мое решение, и да, способ хранения БД в беспорядке. в любом случае большое спасибо за ваше предложение - не думал об этом
Сохранение значения даты в числовом столбце (или, что еще хуже, в varchar) — плохая идея. Проблема с производительностью, которая у вас есть, является прямым результатом этого.