有网友反映PostgreSQL oraface的add_months在某些日期与Oracle 的add_months不一致。
查了一下Oracle 的开发手册,add_months是这样定义的, 如果当前日期是月末,或者目标月没有当前日期的,取最后一天。
例子
2015年2月28日是2月的最后一天,所以按照Oracle的计算方法,无论加减多少个月结果应该都是目标月份的月末,而PostgreSQL 并不是这样的 :
以上查询在Oracle应该得到1月31号的结果。
目标月份没有当前日期,去目标月份的最后一天,比如3月30日减去一个月,不可能是2月30日,所以取2月的最后一天,这个规则是和Oracle一致的。
Oracle add_months的解释如下 :
<a href="http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions004.htm">http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions004.htm</a>
orafce中add_months的代码
SELECT ($1 + interval '1 month' * $2)::oracle.date;
问题就出在这里。
所以要和Oracle完全兼容,可以这样
创建两个这样的函数,如果当前日期是月末的话,则目标月取月末,否则就按照PG原来的算法。
测试 :
达到目的