Я работаю в приложении, в котором мне нужно фильтровать политику по дате. Например, если пользователь введет date_from:'21-jul-2017' и date_to:'21-jul-2019', он должен отобразить все политики, созданные за этот период.
Пока что я сделал:
cursor o1 is
select substr(tarifa,1,2), count(*)
from pol p, uvod u, doppov d
WHERE (izdavanje >=:prebacivanje.od) AND (izdavanje<=:prebacivanje.do)
and izdavanje>='01-jul-07'
and p.orgjed = u.sorgz (+)
and DATUM_PREKIDA is not null
and p.polica=d.polica and d.pov_dopl='P'
and d.status='F'
and cisti_ao(p.polica)!=0
group by substr(tarifa,1,2);
:prebacivanje.od и :prebacivanje.do это date_from и date_to. Оба являются полями DATE в базе данных.
Поэтому мне нужно изменить этот запрос, чтобы он возвращал вставленные date_from и date_to в зависимости от того, что ввел пользователь.
Посмотрите на картинку, о которой идет речь. Мне нужно отфильтровать date_from и date_to. Если пользователь вводит точную дату, например: 21 июня 2017 г. - 21 июля 2019 г., необходимо вернуть всю политику в этот интервал. В основном фильтрация, но я частично складываю, когда мне нужно изменить этот запрос, чтобы ввести дату ввода в поле.
Как я могу точно указать дату, которую пользователь вставил в текстовое поле?
Разве это не то, что уже делает ваш запрос, ссылаясь на :prebacivanje.od и :prebacivanje.do?
Да, но этот запрос нужно изменить. Поскольку у меня нет достаточного опыта работы с PLSQL, я понятия не имею, как это лучше всего сделать. На данный момент я нашел следующее: to_char(izdavanje,'MM')||to_char(izdavanje,'YY') Не работает для меня! ! !
Вы имеете в виду, что хотите показывать каждый год/месяц в этом периоде и количество полисов в этом месяце, а не отдельное количество для каждого тарифа? Если да, хотите ли вы, чтобы месяцы без политик отображались как ноль? Примеры данных и ожидаемые результаты действительно помогут. См. минимальный воспроизводимый пример.
Да, именно для просмотра всех полисов за год/месяц за этот период и количества полисов за этот период. Если в этот период нет политик, отображается ноль (0)


Поскольку это курсор, который существует где-то в форме, этот код, вероятно, должен быть выполнен как-то. Это когда на кнопку нажимаешь или что?
В любом случае: хотя вы никогда не говорили, в чем проблема (вы получаете ошибку? Если да, то какую? ORA-xxxxx, FRM-xxxxx?) (я предполагаю, что запрос ничего не возвращает), кажется, что параметры беспокоят ты.
Запрос - как есть - правильно написан. Тип данных этих столбцов — DATE — таким должен быть и тип данных элементов. Если это не так (но CHAR), вам придется преобразовать его в DATE с помощью TO_DATE, например.
WHERE izdavanje >= to_date(:prebacivanje.od, 'dd-mon-yy')
AND izdavanje <= to_date(:prebacivanje.do, 'dd-mon-yy')
AND izdavanje >= to_date('01-jul-07' , 'dd-mon-yy')
Чтобы убедиться, какую маску формата использовать, отобразите значения элементов в начале этой процедуры PL/SQL, используя встроенный MESSAGE:
declare
cursor o1 is ...
begin
message('od = ' || :prebacivanje.od);
message('do = ' || :prebacivanje.do);
... the rest of your code goes here
end;
Вообще говоря, лучший вариант — убедиться, что типы данных совпадают; в противном случае вам придется позаботиться о преобразовании или (что еще хуже) полагаться на неявное преобразование, которое попытается выполнить Oracle; иногда это удается, иногда нет.
:prebacivanje.od и :prebacivanje.do - это поле DATE, как я вижу из базы данных.
@Littlefoot, мне нравится твоя фраза "sometimes it'll succeed, sometimes not". Я не могу сказать вам, сколько раз я по глупости думал, что числовой столбец хранится как число (это был VARCHAR2), и получал ошибку «невозможно преобразовать в число».
Я не совсем понимаю, о чем вы спрашиваете. В чем проблема с кодом, который вы показали? Передаются ли переменные связывания как фактические даты или строки? (Я не очень хорошо знаком с Forms! Из предыдущего вопроса это если Oracle 8.0.5 и Forms 6.0.5.)