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