#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')
?