我正在创建Oracle报告,我希望根据打印报告的时间显示某些结果。有一个名为apply_date的字段。例如,如果我打印报告< = sysdate 3/15,那么我只想显示apply_date为3/1 - 3/15的记录。这也适用于每个月30日的打印。如果我在3/15之后打印报告,那么它只会显示apply_date为> = 3/16的结果。
答案 0 :(得分: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'
)
答案 1 :(得分: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
执行R.H.S.谓词将转换为:
where apply_date >= <date>
and apply_date < <date>