为了选择两个月之间的生日,其中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评论:
” I don’t like to to_char the predicate,in order to make use of
index”
什么指数? dateOfBirth上的正常索引不会有任何用处,因为索引条目将以year元素引导.因此,它无法帮助您找到12月23日出生的所有人的记录.