我最近发现了Oracle向给定日期添加月份(使用ADD_MONTHS函数)和Java向日历对象添加月份的方式之间的差异。
例如,在oracle中:
select add_months('2009-02-28', +1) from dual;生成结果:"09-03-31“
和查询:
select add_months('2009-02-28', -1) from dual;生成结果"09-01-31“
然而,在Java语言中,相同的计算结果(使用GregorianCalendar.add()方法)分别为: 09-03-28和09-01-28
有什么方法可以使Oracle和Java的行为相同吗?(例如oracle中的某些设置或Java中的某些参数)?
发布于 2009-09-24 19:38:12
来自add_months上的Oracle参考(http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/functions004.htm)
如果date是该月的最后一天,或者如果结果月份的天数少于date的day组件,则结果为结果月份的最后一天。否则,结果具有与日期相同的日期组件。
这意味着您必须为Java编写一个方法,该方法执行相同的检查以获得相同的结果(或者PL/SQL中行为与Java相同的函数)。
发布于 2009-09-24 23:58:12
当您进行月份计算时,您需要从业务的角度决定处理不同天数的月份的正确方法。你提出的问题的另一面是,从一个较长的月份,如8月,变成一个较短的月份,如2月(如果涉及闰年,甚至从2月到2月)会发生什么。如果您乐于看到由于计算找不到'Feb-30‘而报告错误,那么可以查看INTERVAL
发布于 2019-09-11 22:14:35
你可以像bellow一样创建自己的DateService类,并使用"addMonthToDateLikeOracle“方法。
package db;
import org.joda.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
public class DateService {
public static Date addMonthToDateLikeOracle(Date date, int months) {
Calendar c = Calendar.getInstance();
c.setTime(date);
Date retval;
if (DateService.isLastDayOfMonth(date)) {
c.add(Calendar.MONTH, 1);
c.add(Calendar.MONTH, 1);
c.set(Calendar.DATE, 1);
c.add(Calendar.DATE, -1);
retval = c.getTime();
} else {
retval = LocalDate.fromDateFields(date).plusMonths(months).toDate();
}
return retval;
}
public static boolean isLastDayOfMonth(Date date) {
if (date == null) {
throw new RuntimeException("The date parameter cannot be null!");
}
Date endOfMonth = getEndOfMonth(date);
return endOfMonth.equals(date);
}
public static Date getEndOfMonth(Date date) {
Date startOfMonth = getStartOfMonth(date);
Date startOfNextMonth = LocalDate.fromDateFields(startOfMonth).plusMonths(1).toDate();
return LocalDate.fromDateFields(startOfNextMonth).plusDays(-1).toDate();
}
public static Date getStartOfMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
}https://stackoverflow.com/questions/1473713
复制相似问题