【问题标题】:Finding all records within a date range in Oracle 12c在 Oracle 12c 中查找日期范围内的所有记录
【发布时间】:2017-04-24 14:43:08
【问题描述】:

我不确定为什么我的语法不起作用,但我正在查找字段 Pend_Start_Dt 大于我的变量 PndStDt 并且 Pend_End_Date 小于我的变量 PndEnDt 的所有记录。如果记录没有当前的结束日期,那么它也应该提取它,只要开始日期在用户输入的开始日期和结束日期之间。

所以,基本上,有两种情况应该包含记录:

开始日期字段大于或等于用户输入的开始日期并且结束日期字段小于或等于用户输入的结束日期

开始日期字段介于用户输入的开始日期和结束日期之间并且结束日期字段为空。

我希望这不会太令人困惑。

我尝试的语法如下,但我的存储过程无法编译。

Where a.Audit_Status = '3' 
AND ((a.Pend_Start_DT >= TO_DATE (PndStDt, 'yyyy/mm/dd')) AND (a.Pend_End_DT <= (PndEnDT, 'yyyy/mm/dd')) 
    OR ((a.Pend_Start_DT between TO_DATE (PndStDt, 'yyyy/mm/dd') and TO_DATE (PndEnDT, 'yyyy/mm/dd') AND a.Pend_End_DT is null));

【问题讨论】:

  • 编译错误是什么?
  • 第二种情况,如果结束日期为空,是不是只需要查找Pend_Start_DT &lt;= PndStDtPend_End_DT is null的记录?不用between
  • 它返回的错误是,“此运算符后面必须跟 ANY 或 ALL”。如果我将其简化为它可以工作,但它需要返回的内容并不准确:AND (a.Pend_Start_DT >= PndStDt and a.Pend_Start_DT

标签: sql oracle


【解决方案1】:

缺少TO_DATE 并且括号不在正确的位置:

WHERE a.Audit_Status = '3'
AND
( 
   ( a.Pend_Start_DT    >= To_Date( PndStDt, 'yyyy/mm/dd' )
      AND a.Pend_End_DT <= To_Date( PndEnDT, 'yyyy/mm/dd' )
   )
   OR
   ( a.Pend_Start_DT BETWEEN To_Date( PndStDt, 'yyyy/mm/dd' ) 
      AND To_Date( PndEnDT, 'yyyy/mm/dd' )
      AND a.Pend_End_DT IS NULL
   ) 
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2023-03-26
    • 2023-04-10
    • 2021-01-29
    相关资源
    最近更新 更多