Java 8通过Connector/J查询MySQL 8.0两时间戳范围数据无返回问题
问题排查与解决方案
核心错误点
你代码中存在明确的参数类型传参错误:
你已经通过geTime、leTime两个long类型时间戳构造了geStamp、leStamp两个java.sql.Timestamp对象,但调用setTimestamp方法时传入的却是long类型的geTime、leTime,而非构造好的Timestamp对象。PreparedStatement的setTimestamp方法第二个参数要求必须是java.sql.Timestamp类型,传入long类型会导致参数绑定失败,最终查询条件不匹配返回空结果。
修正后的参数绑定代码如下:
stmt.setInt(1, perId); // 传入构造好的Timestamp对象,而非long类型的原始时间戳 stmt.setTimestamp(2, geStamp); stmt.setTimestamp(3, leStamp);
其他可选排查点
如果修正上述问题后仍未解决,可以依次检查以下项:
- 时区不一致问题:JDBC连接的默认时区和MySQL服务端、Workbench使用的时区不一致,会导致datetime类型的参数隐式转换时出现时间偏移,最终查询条件不匹配。可以在JDBC连接串中明确指定时区,例如添加参数
serverTimezone=Asia/Shanghai(替换为你实际使用的时区即可) - 事务隔离级别问题:你插入测试数据的会话未提交事务,JDBC连接使用默认的可重复读隔离级别时,无法读到未提交的数据
- 参数值校验:执行查询前打印
perId、geStamp、leStamp的实际值,和Workbench中执行的查询参数做对比,确认参数值符合预期 - 连接环境校验:确认
mySqlConn连接的是和Workbench相同的库、表环境,避免连错测试/生产环境导致查询无结果
内容的提问来源于stack exchange,提问作者TSwanson9411
相关产品推荐
相关产品推荐

