Фильтрация даты для извлечения из вида не работает - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть код, который преобразует формат даты в DD / MM / YYYY, чтобы создать представление. Первоначально формат даты был dd.mm.yyyy hh24.mi.ss.поэтому я преобразовал это.

  NVL(TO_CHAR(D_TRANS.TRANS_DATE, 'DD/MM/YYYY'), 'NULL') AS CASE_DATE

Я хочу получить данные из представления, используя фильтр Дата между, изначально работал, а теперь больше не работает.Он приходит с этой ошибкой

«не числовой символ был найден там, где ожидалось числовое значение» * Причина: входные данные для преобразования с использованием модели формата даты были неверными.Входные данные не содержали число, для которого номер требовался моделью формата.* Действие: Исправьте входные данные или модель формата даты, чтобы убедиться, что элементы совпадают по количеству и типу.Затем повторите операцию.

     SELECT * FROM VIEW_info   
  WHERE CASE_DATE BETWEEN TO_DATE('&ENTER_START_DATE', 'DD/MM/YYYY')  
     AND TO_DATE('&ENTER_END_DATE',  'DD/MM/YYYY')

Я тоже пробовал это, но даю только извлечение 5 информации из тысяч записей

 SELECT * FROM VIEW_info
 WHERE CASE_DATE BETWEEN TO_CHAR(TO_DATE('&ENTER_START_DATE', 
'DD/MM/YYYY'), 'DD/MM/YYYY')  AND TO_CHAR(TO_DATE('&ENTER_END_DATE',  
'DD/MM/YYYY'), 'DD/MM/YYYY')

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Это просто не может работать;строки сортируются иначе, чем даты (или числа), поэтому «11» стоит перед «2».

Лучше всего работать с датами, если CASE_DATE равно дате.Это?Тогда вам нужно будет

select * from view_info
where case_date between to_date('&start_date', 'dd/mm/yyyy')
                    and to_date('&end_date'  , 'dd/mm/yyyy')

Если это строка (столбец VARCHAR2), вам сначала нужно будет преобразовать ее в дату (при условии, что этот формат dd/mm/yyyy), например,

select * from view_info
where to_date(case_date, 'dd/mm/yyyy') between to_date('&start_date', 'dd/mm/yyyy')
                                           and to_date('&end_date'  , 'dd/mm/yyyy')

Поскольку вы никогда не узнаете, что пользователи вводят в виде строк, CASE_DATE может легко быть '09 / 04/2019 'или' dd / fx / 234v 'или' $$ 75x # f9 ', и вы выиграли'Вы не сможете TO_DATE таких значений, и ваш запрос не будет выполнен.

0 голосов
/ 09 апреля 2019

Сначала вы конвертируете DATE в CHAR:

TO_CHAR(D_TRANS.TRANS_DATE, 'DD/MM/YYYY') AS CASE_DATE

Затем вы конвертируете строковое значение в дату:

TO_DATE('&ENTER_START_DATE', 'DD/MM/YYYY')

и сравниваете CHAR и DATEтипы данных.
В этом причина вашей ошибки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...