You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询两日期间数据无结果及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的记录。

修正方案:

  1. 调整时间范围:

    • 方案一(推荐):将结束时间设为次日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';
      
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:37:03