##mysql使用between and处理时间区间不包括右边界问题
最近自己写项目发现mysql使用between and处理时间区间不包括右边界。
SELECT * FROM timeline WHERE username = ‘Allen’ AND logTime BETWEEN ‘2017-04-01’ AND DATE_ADD(‘2017-04-04’,INTERVAL 1 DAY);
这里写图片描述
在查询的结果中没有发现有2017-04-04的记录,一番查找后发现mysql中对日期的查询对时分秒默认的是 00:00:00,所以显示出来的实际上只是‘2017-04-01 00:00:00’到‘2017-04-04 00:00:00‘,2017-04-04这天的记录是查不到的哦。
解决办法:
1,把and后的日期加一天。
SELECT * FROM timeline WHERE username = ‘Allen’ AND logTime BETWEEN ‘2017-04-01’ AND DATE_ADD(‘2017-04-04’,INTERVAL 1 DAY);
2,把and后的日期字符串拼接成’2017-04-04 23:59:59‘.
这里写图片描述
3,如果是使用oracle的话用TO_CHAR, TO_DATE函数

if (ValidateUtil.isNotEmpty(searchTO.getDateRange())) {
            if (ValidateUtil.isNotEmpty(fromDate) && ValidateUtil.isNotEmpty(endDate)) {
                Date inputFromDt = DateUtil.convertStringToDate(DateUtil.DATE_PATTERN, fromDate);
                Date inputToDt = DateUtil.convertStringToDate(DateUtil.DATE_PATTERN, endDate);
                if (inputFromDt.compareTo(inputToDt) == 0) {
                    String inputFromDtStr = DateUtil.convertDateToString(DateUtil.SQL_DATE_PATTERN_YYYY_MM_DD, inputFromDt);
                    sql += " AND TO_CHAR(supt.EVENT_DT,'yyyy-MM-dd') = '" + inputFromDtStr + "'";
                } else {
                    String inputFromDtStr = DateUtil.convertDateToString(DateUtil.SQL_DATE_PATTERN_YYYY_MM_DD, inputFromDt);
                    String inputToDtStr = DateUtil.convertDateToString(DateUtil.SQL_DATE_PATTERN_YYYY_MM_DD, inputToDt);
                    sql += " AND supt.EVENT_DT between TO_DATE('" + inputFromDtStr + "','yyyy-MM-dd') and TO_DATE('" + inputToDtStr + "','yyyy-MM-dd')";
                }
            }
        }

MySQL 日期加减:

DATE_ADD(date,INTERVAL expr type) --加法
DATE_SUB(date,INTERVAL expr type) --减法

更正:

很感谢2楼lengyuleiran同学的评论哦,后面经过我的测试确实也是这样的,所以在这样更正一下between and其实是包括右边界的。select * from date where test_date between ‘2018-01-21’ and '2018-06-07’能查出2018-06-07的数据。只是因为对应数据库字段的类型是datetime,如果是datetime类型,‘2018-06-07’ 会被转成’2018-06-07 00:00:00’类型,所以查不出来2018-06-07的数据。 下面是我在mysql里面的测试。(test_date是在数据库中Date类型)
这里写图片描述

Logo

更多推荐