SQLite日期范围查询失效求助:按YYYY-MM-DD格式化仍无结果
嘿,我之前用JDateChooser做类似功能的时候也踩过不少坑,咱们一步步来排查:
先盯紧日期格式化的细节
你提到用了SimpleDateFormat,这里要注意:格式串里的年份是小写的yyyy,不是大写的YYYY!大写Y代表的是「周年」(比如跨年那周会归到下一年),虽然你的查询是2月,但如果不小心写了new SimpleDateFormat("YYYY-MM-dd"),格式化出来的日期可能和预期不一致。赶紧把格式串改成"yyyy-MM-dd",然后打印一下格式化后的字符串,确认是不是标准的2018-02-01这种格式。检查SQL语句的写法
SQLite的日期比较要求日期值是字符串(TEXT类型)时必须加单引号,比如正确的查询应该是:SELECT * FROM your_table WHERE date_column BETWEEN '2018-02-01' AND '2018-02-14'如果你是直接拼接字符串生成SQL,一定要确保日期前后加了单引号!另外,强烈建议用
PreparedStatement来构建查询,既避免单引号的问题,还能防止SQL注入:String sql = "SELECT * FROM your_table WHERE date_column BETWEEN ? AND ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, formattedStartDate); // 格式化后的开始日期字符串 stmt.setString(2, formattedEndDate); // 格式化后的结束日期字符串 ResultSet rs = stmt.executeQuery();验证数据库中的存储格式
打开SQLite的可视化工具(比如DB Browser for SQLite),直接执行你拼接好的SQL语句,看看能不能查到数据。如果工具里能查到,但代码里查不到,那就是代码的问题;如果工具里也查不到,那说明数据库里的日期存储格式不对——比如是不是存成了2018/02/01、2018-2-1(缺前导零)这种非标准格式?这种情况下字符串比较会失效,得先把数据库里的日期统一成YYYY-MM-DD格式。确认JDateChooser的日期获取是否正确
别忽略最基础的点:你从JDateChooser拿到的Date对象是不是你选择的日期?可以在格式化前加一行System.out.println(jDateChooser.getDate()),看看输出的日期对不对,有没有可能是默认的当前日期或者null?排查结果集的处理逻辑
万一查询到了结果,但表格没显示呢?可以在获取ResultSet后,先打印一下rs.next()的返回值,或者遍历ResultSet打印每条记录,确认是不是真的没有数据,还是表格渲染的时候出了问题。
按照这个顺序排查,大概率能找到问题所在!
内容的提问来源于stack exchange,提问作者Xevon

