недопустимый идентификатор с Sysdate

#sql #plsql

#sql #plsql

Вопрос:

Я пытаюсь запросить таблицу и получить все записи, в которых дата отчета является предыдущей датой.

 select to_date(RPT_DATE,'YYYY-MM-DD') Report_Date,
from tableY
where Report_Date = Sysdate -1
  

Но я получаю сообщение об ошибке с указанием недопустимого идентификатора в предложении where. RPT_DATE — это переменный символ в таблице.
и имеет формат гггг-мм-дд.
Как мне извлечь все записи за предыдущий день?

Ответ №1:

Вы не можете использовать псевдоним столбца в where предложении. Кроме того, вам не хватает sysdate компонента времени.

Итак, что вы хотите:

 select to_date(RPT_DATE, 'YYYY-MM-DD') as Report_Date,
from tableY
where trunc(to_date(RPT_DATE, 'YYYY-MM-DD')) = trunc(sysdate - 1) ;
  

На самом деле, это не оптимально, поскольку предотвращает использование индекса on RPT_DATE . На самом деле, хранение RPT_DATE в виде строки не является оптимальным. Если бы он был сохранен как дата, вы бы использовали:

 where RPT_DATE >= trunc(sysdate - interval '1' day) and
      RPT_DATE < trunc(sysdate)
  

Хотя это выглядит немного сложнее, он может использовать индекс на RPT_DATE — при условии, что столбец хранится как дата.

Комментарии:

1. Я получил эту ошибку, когда попробовал это. ORA-00932: несогласованные типы данных: ожидаемый НОМЕР получил ДАТУ 00932. 00000 — «несогласованные типы данных: ожидаемый %s получил %s». Похоже, что столбец RPT_DATE представляет собой число, как предполагает его тип данных varcahar . Но sysdate — это дата. Нужно ли вводить регистр sysdate в число? если да, могу ли я по-прежнему использовать значение -1 для перехода к предыдущей дате? PS: Таблица заполняется заданием. Я не уверен, что смогу изменить формат данных.

2. Это сработало «где trunc(to_date(RPT_DATE,’ГГГГ-ММ-ДД’)) = trunc(sysdate — 1);» Но правильно ли это делать?

3. @RLearner . , , Да, учитывая ваши данные. Однако столбец должен быть исправлен date как тип данных.

Ответ №2:

Почему не просто where rpt_date = to_char(sysdate - 1, 'yyyy-mm-dd') ?