首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle add_months函数不同于Java

问oracle add_months函数不同于Java
EN

Stack Overflow用户
提问于 2009-09-24 19:29:50
回答 4查看 3.3K关注 0票数 2

我最近发现了Oracle向给定日期添加月份(使用ADD_MONTHS函数)和Java向日历对象添加月份的方式之间的差异。

例如,在oracle中:

代码语言:javascript
复制
select add_months('2009-02-28', +1) from dual;

生成结果:"09-03-31“

和查询:

代码语言:javascript
复制
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中的某些参数)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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相同的函数)。

票数 2
EN

Stack Overflow用户

发布于 2009-09-24 23:58:12

当您进行月份计算时,您需要从业务的角度决定处理不同天数的月份的正确方法。你提出的问题的另一面是,从一个较长的月份,如8月,变成一个较短的月份,如2月(如果涉及闰年,甚至从2月到2月)会发生什么。如果您乐于看到由于计算找不到'Feb-30‘而报告错误,那么可以查看INTERVAL

票数 5
EN

Stack Overflow用户

发布于 2019-09-11 22:14:35

你可以像bellow一样创建自己的DateService类,并使用"addMonthToDateLikeOracle“方法。

代码语言:javascript
复制
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();
    }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1473713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档