为了选择两个月之间的生日,其中 FROMDATE 和 TODATE 是准备好的语句中的一些参数,我想了如下:
select
p.id as person_id,
...
...
where e.active = 1
and extract(month from TODATE) >= extract(month from e.dateOfBirth)
and extract(month from e.dateOfBirth) >= extract(month from FROMDATE)
order by extract(month from e.dateOfBirth) DESC,
extract(day from e.dateOfBirth) DESC
如何改进以适应数天的工作?
在 Oracle 中搜索日期范围的方法不止一种。对于您的场景,我建议您将所有涉及日期的月份和日期元素转换为数字。
select
p.id as person_id,
...
...
where e.active = 1
and to_number (to_char( e.dateOfBirth, 'MMDD'))
between to_number (to_char( FROMDATE, 'MMDD'))
and to_number (to_char( TODATE, 'MMDD'))
order by extract(month from e.dateOfBirth) DESC,
extract(day from e.dateOfBirth) DESC
这不会使用任何索引e.dateOfBirth
柱子。这是否重要取决于您想要运行查询的频率。
@AdeelAnsari 评论:
“我不喜欢 to_char 谓词,以便利用
指数”
什么指数?正常索引dateOfBirth
不会有任何用处,因为索引条目将以年份元素开头。所以它不能帮助你找到出生日期的所有记录any12 月 23 日。
基于函数的索引 - 或者在 11g 中,带有索引的虚拟列(基本上是同一件事) - 是对日期列的各个部分进行索引的唯一方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)