Oracle - значение даты преобразования TO_CHAR () - PullRequest
2 голосов
/ 04 ноября 2011

Хорошо, поэтому я хочу преобразовать значение даты для правильного форматирования моей даты для сравнения, однако, будет ли преобразование моего типа данных "DATE" в char повлиять на индексирование при сравнении в этом поле? Могу ли я решить эту проблему, выполнив to_date (tochar ())? Любой совет по этому вопросу будет принята с благодарностью Спасибо!

РЕДАКТИРОВАТЬ - Извините за отсутствие подробностей .... в основном мне нужно удалить метку времени из моей даты, я использовал следующее, и похоже, что он работает TO_DATE (TO_CHAR, 'YYYY-MM -DD ​​'),' YYYY-MM-DD '), заметьте, я не знаю, является ли это хорошей практикой или нет, но, по крайней мере (или я так думаю), теперь она сравнивает ДАТУ с ДАТА, а не строка.

Ответы [ 3 ]

8 голосов
/ 04 ноября 2011

Если вы делаете сравнение, вы не должны конвертировать дату в строку.Вы должны сравнивать с другой датой.В противном случае Oracle не сможет использовать нефункциональный индекс в столбце даты.

В общем, то есть вам лучше кодировать

WHERE some_indexed_date_column = to_date( :string_bind_variable, 
                                          <<format mask>> )

, а не

WHERE to_char( some_indexed_date_column, 
               <<format mask>> ) = :string_bind_variable

Конечно, если ваша переменная связывания может быть DATE, а не VARCHAR2, это даже лучше, потому что тогда вам не нужно выполнять какое-либо преобразование типов данных, и оптимизатору будет намного проще оценить количество элементов.

Если вы пытаетесь сделать некоторыеманипулирование датой - например, если вы хотите сравнить часть дня, опуская часть времени даты - вы можете использовать индексы на основе функций.Например, если вы хотите найти все строки, которые были созданы сегодня,

WHERE trunc( some_date_column ) = date '2011-11-04'

, вы можете создать индекс на основе функций для столбца даты

CREATE INDEX idx_trunc_dt
    ON table_name( trunc( some_date_column ) )

илиможет переписать запрос, чтобы сделать что-то вроде

WHERE some_date_column >= date '2011-11-04'
  AND some_date_column <  date '2011-11-05'
3 голосов
/ 04 ноября 2011

Вы должны сравнивать даты как даты, а не как строки. Если вы сравниваете дату со строкой, преобразуйте строку в дату для сравнения.

2 голосов
/ 04 ноября 2011

IMO, вы должны преобразовать значение сравнения в формат, сохраненный в базе данных.В противном случае вам нужно будет создать индекс на основе функций для столбца DATE, чтобы воспользоваться преимуществами индексации.Итак, если у вас есть дата ввода символа, скажем, 04.11.2011, вы можете сравнить ее в предложении where следующим образом:

SELECT ...
  FROM your_table
 WHERE the_date_column = TO_DATE('11/4/2011','MM/DD/YYYY');
...