Java SQL异常:java.sql.SQLException: Incorrect DATE value: ‘2021.02.31‘

报错信息:

 Cause: java.sql.SQLException: Incorrect DATE value: '2021.02.31'
; uncategorized SQLException; SQL state [HY000]; error code [1525]; Incorrect DATE value: '2021.02.31'; nested exception is java.sql.SQLException: Incorrect DATE value: '2021.02.31'

代码:

//根据月份统计会员数量
public List<Integer> findMemberCountByMonth(List<String> month) {
  List<Integer> list = new ArrayList<>();
  for(String m : month){
    m = m + ".31";//格式:2019.02.31
    Integer count = memberDao.findMemberCountBeforeDate(m);
    list.add(count);
  }
  return list;
}

产生错误的原因:
在MySQL 5+版本不会报错,但是在MySQL 8+版本上会报错。原因是MySQL 8+版本增加了日期校验,2月31显然是不合法的,因此报错。

解决办法:
需要把拼接字符串修改为获取指定日期的月份的最后一天:

    public List<Integer> findMemberCountByMonth(List<String> month) {
        List<Integer> list = new ArrayList<>();
        for (String m : month) {
            try {
                String date_str = m + "-10";
                Calendar calendar = Calendar.getInstance();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                calendar.setTime(sdf.parse(date_str));
                calendar.add(Calendar.MONTH, 1);
                calendar.set(Calendar.DAY_OF_MONTH, 0);
                // 获取当月最后一天
                String lastDayOfMonth = sdf.format(calendar.getTime());
                Integer count = memberDao.findMemberCountBeforeDate(lastDayOfMonth);
                list.add(count);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return list;
    }

Java获取给定日期的月初和月末两个日期:

    @Test
    public void getFirstAndLastDayOfMonth() throws ParseException {
        String date = "2020-02-01";
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        calendar.setTime(sdf.parse(date));
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        String firstDayOfMonth = sdf.format(calendar.getTime());
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, 0);
        String lastDayOfMonth = sdf.format(calendar.getTime());
        System.out.println(firstDayOfMonth);
        System.out.println(lastDayOfMonth);
    }
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值