Функция SYSDATE
уже возвращает значение DATE, поэтому ...TO_DATE(sysdate-90)
не требуется.Также я не вижу причин заключать весь запрос в скобки.Однако имейте в виду, что в Oracle DATE - это метка времени, содержащая поля для года, месяца, дня, часов, минут и секунд.Когда выполняется сравнение, такое как SCOPE_DT = SYSDATE - 90
, значение SCOPE_DT должно соответствовать не только году / месяцу / дню из SYSDATE, но также часам: минутам: секундам.Я подозреваю, что вы действительно хотите что-то вроде
select *
from CP_FALLOUT_VIEW
where TRUNC(SCOPE_DT) = TRUNC(sysdate) - 90
Здесь функция TRUNC используется для обрезания дат, то есть для установки часов: минут: секунд до 00:00:00, чтобы мы могли эффективносравнивайте только часть дня / месяца / года значений DATE.
Но это будет медленно, потому что мы применяем функцию TRUNC к каждой строке в представлении.Лучшим вариантом будет
SELECT *
FROM CP_FALLOUT_VIEW
WHERE SCOPE_DT BETWEEN TRUNC(SYSDATE) - 90
AND TRUNC(SYSDATE) - 89
Здесь вы определяете, находится ли SCOPE_DT между началом SYSDATE-90 и днем, следующим за ним, то есть SYSDATE-89.Однако даже у этого есть одна небольшая проблема - он выберет SCOPE_DT, который точно соответствует TRUNC (SYSDATE) -89, потому что сравнение BETWEEN
включает его конечные точки.Таким образом, чтобы включить только даты, приходящиеся на день, который в прошлом точно равен 90 дням, и работают достаточно разумно, вы бы хотели использовать
SELECT *
FROM CP_FALLOUT_VIEW
WHERE SCOPE_DT BETWEEN TRUNC(SYSDATE) - INTERVAL '90' DAY
AND TRUNC(SYSDATE) - INTERVAL '89' DAY - INTERVAL '1' SECOND
Best of luck.