Получить точно вставленные date_from и date_to

Я работаю в приложении, в котором мне нужно фильтровать политику по дате. Например, если пользователь введет 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

Я не совсем понимаю, о чем вы спрашиваете. В чем проблема с кодом, который вы показали? Передаются ли переменные связывания как фактические даты или строки? (Я не очень хорошо знаком с Forms! Из предыдущего вопроса это если Oracle 8.0.5 и Forms 6.0.5.)

Alex Poole 16.07.2019 14:08

Посмотрите на картинку, о которой идет речь. Мне нужно отфильтровать date_from и date_to. Если пользователь вводит точную дату, например: 21 июня 2017 г. - 21 июля 2019 г., необходимо вернуть всю политику в этот интервал. В основном фильтрация, но я частично складываю, когда мне нужно изменить этот запрос, чтобы ввести дату ввода в поле.

user11410351 16.07.2019 14:10

Как я могу точно указать дату, которую пользователь вставил в текстовое поле?

user11410351 16.07.2019 14:10

Разве это не то, что уже делает ваш запрос, ссылаясь на :prebacivanje.od и :prebacivanje.do?

Alex Poole 16.07.2019 14:12

Да, но этот запрос нужно изменить. Поскольку у меня нет достаточного опыта работы с PLSQL, я понятия не имею, как это лучше всего сделать. На данный момент я нашел следующее: to_char(izdavanje,'MM')||to_char(izdavanje,'YY') Не работает для меня! ! !

user11410351 16.07.2019 14:14

Вы имеете в виду, что хотите показывать каждый год/месяц в этом периоде и количество полисов в этом месяце, а не отдельное количество для каждого тарифа? Если да, хотите ли вы, чтобы месяцы без политик отображались как ноль? Примеры данных и ожидаемые результаты действительно помогут. См. минимальный воспроизводимый пример.

Alex Poole 16.07.2019 14:17

Да, именно для просмотра всех полисов за год/месяц за этот период и количества полисов за этот период. Если в этот период нет политик, отображается ноль (0)

user11410351 16.07.2019 14:20
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
7
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку это курсор, который существует где-то в форме, этот код, вероятно, должен быть выполнен как-то. Это когда на кнопку нажимаешь или что?

В любом случае: хотя вы никогда не говорили, в чем проблема (вы получаете ошибку? Если да, то какую? 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, как я вижу из базы данных.

user11410351 16.07.2019 14:41

@Littlefoot, мне нравится твоя фраза "sometimes it'll succeed, sometimes not". Я не могу сказать вам, сколько раз я по глупости думал, что числовой столбец хранится как число (это был VARCHAR2), и получал ошибку «невозможно преобразовать в число».

Brian Leach 16.07.2019 18:21

Другие вопросы по теме