天天看点

PostgreSQL Oracle 兼容性之 - add_months

有网友反映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原来的算法。

测试 : 

达到目的