У меня есть столбец в Oracle DB с типом данных varchar2. Типичное значение, хранящееся в этом столбце, похоже на 16.06.2015 02:14:18 AM.
Первый вопрос: почему вы храните ДАТУ как строку? Использование соответствующего типа данных - одна из наиболее важных частей дизайна базы данных и производительности.
Помните, что DATE не имеет того формата, который вы видите, он хранится внутри в 7 bytes
, который является проприетарным форматом Oracle. Не рекомендуется хранить дату в виде строки, чтобы иметь фиксированный формат.
Я бы посоветовал сначала исправить дизайн, чтобы вам не приходилось выполнять эти накладные расходы при сравнении дат. В долгосрочной перспективе это поможет вам.
1. Добавьте новый столбец как тип данных DATE.
ALTER TABLE table_name
ADD new_column DATE;
2. Обновите новый столбец.
UPDATE table_name
SET new_column = TO_DATE(old_column, 'mm/dd/yyyy hh:mi:ss pm');
3. УДАЛИТЬ старый столбец.
ALTER TABLE table_name
DROP COLUMN old_column;
4. Переименуйте новый столбец в старое имя столбца.
ALTER TABLE table_name
RENAME COLUMN old_name to new_name;
Теперь вы можете легко сравнивать даты:
SELECT * FROM MYTABLE WHERE mycolumn > to_date('01-08-2015','dd-mm-yyyy');
Это также будет использовать любой обычный индекс в столбце даты.
С точки зрения производительности:
Если вы не исправите это сейчас, вы будете продолжать сталкиваться с проблемами производительности. Поскольку немедленное исправление SUBSTR
не позволит вам использовать обычный индекс, вам необходимо создать функциональный индекс.
person
Lalit Kumar B
schedule
28.08.2015
06/16/2015 02:14:18 AM
не соответствует маске форматаdd-mm-yyyy
, которую вы используете в своемto_date()
вызове этого столбца. Вы хотитеmm/dd/yyyy
вместо - person a_horse_with_no_name   schedule 28.08.2015mm/'dd/yyyy'
- person Jens   schedule 28.08.2015DATE
какVARCHAR2
? Использование соответствующего типа данных - одна из наиболее важных частей проектирования и производительности базы данных. - person Lalit Kumar B   schedule 28.08.2015