mysql datetime 类型接收 String 类型传参查询无结果

mysql datetime 类型接收 String 类型传参查询无结果


异常描述

  • 项目开发过程中需要查询某天的数据
    • 实现方案
      • time like “yyyy-MM-dd%”
      • time between “今天0点” and “明日0点”
  • 选择 between and 方案,传入字符串时间
// Serivce 代码片段
// Mapper.java 接口入参为 Map 
params.put("createTimeBegin", DateUtil.formatDate(DateUtil.getTodayBeginDate(),"yyyy-MM-dd HH:mm:ss")); // 当前日期
        params.put("createTimeEnd",DateUtil.formatDate(DateUtil.getTomorrowBeginDate(),"yyyy-MM-dd HH:mm:ss")); // 明日日期

// MyBatis Mapper.xml 
        <if test="createTimeBegin != null and createTimeEnd != null">
            AND gmt_create BETWEEN #{createTimeBegin} AND #{createTimeEnd}
        </if>
  • 单元测试前已经在本地MySQL工具中测试过,有返回值
  • 单元测试结果返回值为空

异常调试

  • 初步确认为 #{} 与 ${} 的问题,以为字符串传递过程中出现问题
    • 再次测试依然无结果
  • 又想到datetime为时间类型,可能不接收String类型的传参,去掉DateUtil.format 直接传 Date ,结果正确
  • 项目交付后,再次测试传递字符串,发现当时不是字符串的问题
    public static String formatDate(Date date, String format) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.format(date);
    }
    public static Date getTodayBeginDate() {
        int y, m, d;
        Calendar cal = Calendar.getInstance();
        y = cal.get(Calendar.YEAR);
        m = cal.get(Calendar.MONTH);
        d = cal.get(Calendar.DATE);
        cal.set(y, m, d, 0, 0, 0);//时、分、秒,设置成0,获取凌晨的时间
        return cal.getTime();
    }
    public static void main(String[] args) {
        Date todayBeginDate = DateUtil.getTodayBeginDate();
        System.out.println(todayBeginDate.toString()); // Thu Oct 04 00:00:00 CST 2018
        String s = DateUtil.formatDate(todayBeginDate, "yyyy-MM-dd hh:mm:ss");
        System.out.println(s); // 2018-10-04 12:00:00
        // 相差12个小时
    }
  • 从运行结果上看,直接输出的Date是0点0分0秒,格式化后且变为12点0分0秒
  • 很巧合的是当时选择的测试数据选择的是当天的测试数据,所以没有查询结果,如果选择的是历史数据,这个BUG就不会复现了

异常原因

  • 问题发生在字符串格式化的符号上
  • h:上午或下午 1~12点
  • H:全天 0 ~ 24 点
    public static void main(String[] args) {
        Date todayBeginDate = DateUtil.getTodayBeginDate();
        System.out.println(todayBeginDate.toString()); // Thu Oct 04 00:00:00 CST 2018
        String todayBeginDateStr = DateUtil.formatDate(todayBeginDate, "yyyy-MM-dd hh:mm:ss");
        System.out.println(todayBeginDateStr); // 2018-10-04 12:00:00
        // 相差12个小时
        todayBeginDateStr = DateUtil.formatDate(todayBeginDate, "yyyy-MM-dd HH:mm:ss");
        System.out.println(todayBeginDateStr); // 2018-10-04 00:00:00
    }
  • 将 h 改为 H 后再次测试,结果输出正确

参考资料


问题总结

  • mysql 中 datetime 类型的字段可以接收 字符串或java.util.Date类型的参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值