在请求 oracle 中按日期选择(之间)

Posted

技术标签:

【中文标题】在请求 oracle 中按日期选择(之间)【英文标题】:Selection by date in request oracle (between) 【发布时间】:2020-03-06 07:39:57 【问题描述】:

我编写了一个在 apex 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”。如果您能帮我找出错误,我将不胜感激!

【问题讨论】:

Apex_MAN,这仍然是个问题吗?您是否查看了以下答案? @DanMcGhan 是的,这是一个问题,在下面的答案中它只隐藏了 quola 给不为空。如果为空则错误! ,但是mpen还有另一个问题。我已经这样做了,当我更改至少一个 ITEM 时,我有一个动态操作(使用新的 ITEM 参数更新页面),但我想在它们下创建一个按钮来清除所有过滤器。我还使用了一个动态操作,其中我将所有项目分配为空。但是随后页面会不断重新加载。我无法解决这个问题( @DanMcGhan 事实证明我有 3 个过滤器(:P115_SILO_NAME、:P115_ORG 和:P115_DATA1、:P115_DATA2),但除日期之外的所有内容都是正确的( 我很难理解你,但让我们试着专注于你在使用日期过滤器时遇到困难的事实。你说它们不能正常工作是什么意思?你得到一个错误,没有行回来,还是别的什么? eb.DATE_TMRT 的数据类型是什么?给我一个你在 P115_DATA1 和 P115_DATA2 中测试的值的例子。 @DanMcGhan (:P115_ORG 为 null 或 we.name = :P115_ORG) 和 (:P115_SILO_NAME 为 null 或 ah.name = :P115_SILO_NAME) 和 (to_timestamp(eb.DATE_TMRT,'dd.mm. yyyy hh24:mi:ss') 在 to_timestamp(:BV1,'dd.mm.yyyy hh24:mi:ss') 和 to_timestamp(:BV2,'dd.mm.yyyy hh24:mi:ss') 或 (:BV2为空或:BV1 为空)) 【参考方案1】:

我想应该是这样的

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 条件排除在外。

【讨论】:

感谢您的帮助,您还能看看我的一个问题吗? ***.com/questions/60503335/…【参考方案2】:

假设条件(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)

【讨论】:

以上是关于在请求 oracle 中按日期选择(之间)的主要内容,如果未能解决你的问题,请参考以下文章

如果日期列介于开始日期和结束日期之间,则选择行 FMDB 请求

在 CodeIgniter 中按日期过滤 MySQL 条目

如何在 CI Active Record 中按 MAX 日期选择

无法在熊猫数据框中按时间戳索引

谓词,从 NSDate 中按年份过滤,产生一个 nil 日期和一个讽刺的 Xcode 错误

ORA-00936 在 oracle 选择语句中使用日期函数时