Выбор по дате в запросе oracle (между) - PullRequest
1 голос
/ 06 марта 2020

Я написал запрос, который я использую в вершине oracle, в который я добавил фильтры, но когда я добавляю выбор даты, этот запрос не работает (хотя синтаксических ошибок нет). Я буду благодарен за помощь

select eb.ID,
       eb.NAME,
       eb.TEMP,
       eb.ID_TRANS,
       eb.CR_DATE,
       eb.DATE_TMRT,
       ah.name as Silo_name,
       we.name as ORGANIZATIONS,
       ad.name as item
              from TEMPR_SILO  eb
              left join  ORGANIZATIONS we on  eb.ORGANIZATIONS =  we.id
              left join  ITEM_CRITICALTEMP ad on  ad.id <> 0 
              left join  silo ah  on  ah.id = ad.id_silo 
where   (:P115_ORG is null or we.name = :P115_ORG) 
and (:P115_SILO_NAME is null or  ah.name = :P115_SILO_NAME) 
and  to_timestamp(eb.DATE_TMRT)  between to_timestamp(:P115_DATA1,'dd.mm.yyyy') and to_timestamp(:P115_DATA2,'dd.mm.yyyy') 
------ when "OR" is missing then everything works ---
or   (:P115_DATA2 is null OR :P115_DATA1 is null)
group by
       eb.ID,
       eb.NAME,
       eb.TEMP,
       eb.ID_TRANS,
       eb.CR_DATE,
       eb.DATE_TMRT,
       we.name,
       ah.name,
       ad.name  

Но отфильтрованные даты не могут быть указаны, и мне нужны все записи, поэтому "OP" должно быть. Буду признателен, если вы поможете мне найти ошибку!

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Предполагая, что одно из условий (BETWEEN/NULL) должно быть истинным.
Измените следующее

and  to_timestamp(eb.DATE_TMRT)  between to_timestamp(:P115_DATA1,'dd.mm.yyyy') and to_timestamp(:P115_DATA2,'dd.mm.yyyy') 
------ when "OR" is missing then everything works ---
or   (:P115_DATA2 is null OR :P115_DATA1 is null)

на

and  (to_timestamp(eb.DATE_TMRT)  between to_timestamp(:P115_DATA1,'dd.mm.yyyy') and to_timestamp(:P115_DATA2,'dd.mm.yyyy') 
------ when "OR" is missing then everything works ---
or   (:P115_DATA2 is null OR :P115_DATA1 is null))

Я думаю, оно должно работать.

Второй сценарий: когда все условия или Null условие должны быть выполнены:

(
(:P115_ORG is null or we.name = :P115_ORG) 
and (:P115_SILO_NAME is null or  ah.name = :P115_SILO_NAME) 
and  to_timestamp(eb.DATE_TMRT)  between to_timestamp(:P115_DATA1,'dd.mm.yyyy') and to_timestamp(:P115_DATA2,'dd.mm.yyyy')
) 
or   (:P115_DATA2 is null OR :P115_DATA1 is null)
0 голосов
/ 06 марта 2020

Полагаю, это должно было быть

where
  (                                                              --> this 
       (:P115_ORG is null or we.name = :P115_ORG) 
   and (:P115_SILO_NAME is null or  ah.name = :P115_SILO_NAME) 
   and  to_timestamp(eb.DATE_TMRT)  between to_timestamp(:P115_DATA1,'dd.mm.yyyy') 
                                        and to_timestamp(:P115_DATA2,'dd.mm.yyyy') 
  )                                                              --> this
  --
  or   (:P115_DATA2 is null OR :P115_DATA1 is null)

, т. Е. Заключать все AND условия в свои скобки и исключать из них условие OR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...