Результат пустой, когда переменная даты - PullRequest
0 голосов
/ 16 октября 2018

Я использую базу данных Oracle 10g.У меня есть таблица с большим количеством информации.Один из столбцов имеет тип DATE, объявленный следующим образом DATE_INSERT DATE.Я пытаюсь сделать запрос и отфильтровать его по определенной дате.Когда я использую функцию TO_CHAR() в предложении where, я получаю ожидаемую информацию

SELECT * FROM TABLE WHERE TO_CHAR(DATE_INSERT, 'DD/MM/YYYY') = '05/10/2018'

Но когда я использую переменную DATE или функцию TO_DATE(), я получаю пустой набор результатов.

SELECT * FROM TABLE WHERE DATE_INSERT = TO_DATE('05/10/2018','DD/MM/YYYY')

ИЛИ

SELECT * FROM TABLE WHERE DATE_INSERT = date '2018-10-05';

ИЛИ (date_var определено как дата ранее)

SELECT * FROM TABLE WHERE DATE_INSERT = date_var;

По требованию отдела БД мне нужно избавиться от всех функций TO_DATE() / TO_CHAR ().Можете ли вы помочь мне понять, почему фильтрация не работает, когда в запросе используются типы DATE?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Это связано с компонентом времени.Я бы порекомендовал:

WHERE DATE_INSERT >= date '2018-10-05' AND
      DATE_INSERT < date '2018-10-06'

Или:

WHERE TRUNC(DATE_INSERT) = date '2018-10-05'

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

0 голосов
/ 16 октября 2018

В Oracle столбец DATE всегда хранит информацию о дате и времени.Итак, указанный вами запрос:

ВЫБРАТЬ * ИЗ ТАБЛИЦЫ ГДЕ TO_CHAR (DATE_INSERT, 'DD / MM / YYYY') = '05 / 10/2018 '

не использовать равенство, но запрашивает диапазон.Какой диапазон?Весь день, то есть 24 часа.

Для другого запроса вам потребуется использовать диапазон, например:

SELECT * FROM TABLE 
  WHERE DATE_INSERT >= TO_DATE('05/10/2018','DD/MM/YYYY')
    AND DATE_INSERT < TO_DATE('06/10/2018','DD/MM/YYYY')

Более четко, чтобы показать дату и времяинформация:

SELECT * FROM TABLE 
  WHERE DATE_INSERT >= TO_DATE('05/10/2018 00:00:00','DD/MM/YYYY HH24:MI:SS')
    AND DATE_INSERT < TO_DATE('06/10/2018 00:00:00','DD/MM/YYYY HH24:MI:SS')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...