查询两日期间数据无结果及SimpleDateFormat日期解析异常求助
问题解决方案
一、解决日期解析异常(ParseException)
异常根源是:JavaFX DatePicker.getValue() 返回的是 LocalDate 对象,调用 toString() 得到的格式是 yyyy-MM-dd(比如2024-07-29),但你用的 SimpleDateFormat 指定格式为 yyyy-MM-dd HH:mm:ss,格式不匹配导致解析失败。
正确做法:放弃老旧的SimpleDateFormat,使用Java 8+推荐的java.time日期API(线程安全、更易用),直接基于LocalDate对象生成目标格式字符串,无需解析步骤:
// 定义日期时间格式化器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 处理起始日期:将LocalDate转为当天起始时间(00:00:00)并格式化 LocalDate fromLocalDate = fromDatePicker.getValue(); String dateStr1 = fromLocalDate.atStartOfDay().format(formatter); // 处理结束日期:若要包含结束日当天所有记录,转为次日00:00(适配SQL的<条件) LocalDate toLocalDate = toDatePicker.getValue(); String dateStr2 = toLocalDate.atStartOfDay().plusDays(1).format(formatter); // 若坚持用当天23:59:59,可替换为: // String dateStr2 = toLocalDate.atTime(23,59,59).format(formatter);
如果必须兼容Date类型(不推荐),可这样转换:
LocalDate fromLocalDate = fromDatePicker.getValue(); Date date3 = Date.from(fromLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); String dateStr1 = sdf1.format(date3);
二、解决SQL查询无结果问题
你的SQL语句WHERE date Between '2024-08-01 00:00' AND '2024-08-20 00:00'会漏掉2024-08-20当天00:00之后的所有记录,因为BETWEEN是闭区间,仅匹配日期时间等于或早于2024-08-20 00:00:00的记录。
修正方案:
调整时间范围:
- 方案一(推荐):将结束时间设为次日00:00,用
<条件规避时分秒精度问题:SELECT * FROM customerreceipt WHERE date >= '2024-08-01 00:00:00' AND date < '2024-08-21 00:00:00'; - 方案二:将结束时间设为当天23:59:59,保留
BETWEEN:SELECT * FROM customerreceipt WHERE date BETWEEN '2024-08-01 00:00:00' AND '2024-08-20 23:59:59';
- 方案一(推荐):将结束时间设为次日00:00,用
使用PreparedStatement传递参数(最佳实践):
避免字符串拼接,防止SQL注入,同时让数据库自动处理日期类型匹配:String sql = "SELECT * FROM customerreceipt WHERE date >= ? AND date < ?"; PreparedStatement pstmt = connection.prepareStatement(sql); // 将LocalDate转为数据库兼容的Timestamp类型 LocalDate fromDate = fromDatePicker.getValue(); Timestamp startTimestamp = Timestamp.valueOf(fromDate.atStartOfDay()); pstmt.setTimestamp(1, startTimestamp); LocalDate toDate = toDatePicker.getValue(); Timestamp endTimestamp = Timestamp.valueOf(toDate.plusDays(1).atStartOfDay()); pstmt.setTimestamp(2, endTimestamp); ResultSet rs = pstmt.executeQuery();
额外检查点:
- 确认数据库中
date字段类型:如果是DATE类型(无时分秒),直接用BETWEEN '2024-08-01' AND '2024-08-20'即可匹配。 - 检查数据库时区与应用时区是否一致,避免日期存储与查询的时区偏差。
内容的提问来源于stack exchange,提问作者Adamu Ahmad Dalhat
相关产品推荐
相关产品推荐

