有一张表,很多数据:
![](https://images0.cnblogs.com/blog2015/261300/201506/031502094456850.jpg)
想取某个月的数据。初始的想法很简单,根据日期(RQ)形成条件即可:
![](https://images0.cnblogs.com/blog2015/261300/201506/031502344778397.jpg)
符合条件的记录数是 129835,但耗时太长:14.515 秒(RQ字段是做过索引的)!直观的反应是 Oracle 的 TO_CHAR 函数效率不高!那有没有其他函数呢?有,找到了一个 MONTHS_BETWEEN:
![](https://images0.cnblogs.com/blog2015/261300/201506/031504082739052.jpg)
MONTHS_BETWEEN(date1, date2) 是求两个日期之间的月数,以为就像 SQL Server T-SQL 中的 DATEDIFF(m, date1, date2) 一样,既然是提取某个月的数据,当然是 MONTHS_BETWEEN(RQ, TO_DATE('20150301', 'YYYYMMDD')) = 0!但结果是不对的,只有 4188 条记录!仔细研究 MONTHS_BETWEEN,发现与 DATEDIFF(m, date1, date2) 是不一样的:MONTHS_BETWEEN 对于两个同月的日期,也是有 月数差的!额滴神呐!膜拜 Oracle!! 把条件改成下面的形式,就对了:
![](https://images0.cnblogs.com/blog2015/261300/201506/031504304775369.jpg)
但此时的查询效率仍然不理想,还需要 8、9 秒的时间!继续优化,改成下面的形式:
![](https://images0.cnblogs.com/blog2015/261300/201506/031504515088526.jpg)
此时的耗时只有 0.031 秒! 至此,优化已经做完了!但条件的写法能不能再简化些呢?结果是:
![](https://images0.cnblogs.com/blog2015/261300/201506/031505088363254.jpg)
对于 Oracle,还能说什么呢?说什么都是多余的,只有膜拜!!!