加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长百科 > 正文

使用Oracle SQL选择具有给定范围内生日的员工

发布时间:2021-01-15 05:29:58 所属栏目:站长百科 来源:网络整理
导读:为了选择两个月之间的生日,其中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) =

为了选择两个月之间的生日,其中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日出生的所有人的记录.

基于函数的索引 – 或者在11g中,带有索引的虚拟列(基本上是相同的东西) – 是索引日期列部分的唯一方法.

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读