1

我正在创建一个 Oracle 报告,我想根据我打印报告的时间来显示某些结果。有一个名为 apply_date 的字段。例如,如果我打印报告 <= sysdate of 3/15,那么我只想显示 apply_date 为 3/1 - 3/15 的记录。这也适用于每月 30 日的打印。如果我在 3/15 之后打印报告,那么它只会显示 apply_date >= 3/16 的结果。

4

2 回答 2

0

你想要一个where像这样的子句:

where (to_char(sysdate, 'DD') <= '15' and
       to_char(apply_date, 'YYYY-MM') = to_char(sysdate, 'YYYY-MM') and
       to_char(apply_date, 'DD') between '00' and '15'
      ) or
      (to_char(sysdate, 'DD') >= '16' and
       to_char(apply_date, 'YYYY-MM') = to_char(sysdate, 'YYYY-MM') and
       to_char(apply_date, 'DD') >= '16'
      )
于 2013-03-19T20:51:24.033 回答
0

为了充分利用索引并为优化器提供基数的最佳估计,我将尝试构建 SQL,以便谓词不依赖于应用于 apply_date 的函数:

 where apply_date >= case
                     when extract(day from sysdate) < 16
                     then trunc(sysdate,'MM')
                     else trunc(sysdate,'MM')+16
                     end
   and apply_date <  case
                     when extract(day from sysdate) >= 16
                     then add_months(trunc(sysdate,'MM'),1)
                     else trunc(sysdate,'MM')+16
                     end     

在执行时,谓词的 RHS 将转换为:

 where apply_date >= <date>
   and apply_date <  <date>
于 2013-03-19T21:03:32.007 回答