【问题标题】:Cant get records between two dates无法获取两个日期之间的记录
【发布时间】:2013-04-16 10:56:19
【问题描述】:

我的问题是我无法获取两个日期之间的所有记录。

我有两个JDateChoosers。当我选择两个日期(例如“2011 年 4 月 10 日”到“2011 年 4 月 20 日”)时,我希望这些日期之间的所有记录都显示在我的 JList 中。但我无法在JList 中得到任何结果。

我正在使用mysql数据库。

  private void Display(java.awt.event.ActionEvent evt) {

    try 
    { 

        Class.forName("com.mysql.jdbc.Driver");  
        Connection con= 
           (Connection)DriverManager.getConnection(
             "jdbc:mysql://localhost:3306/test","root","ubuntu123");   
        java.util.Date jd =  jDateChooser1.getDate();
        java.util.Date jd1 = jDateChooser2.getDate();

        // PreparedStatement stmt = (PreparedStatement) con.prepareStatement("select date from invoice where date = ?);

        // PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date BETWEEN ' ' AND ' '");

        PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date >= '+jd + ' AND date <= '+jd1 + '");

        pstmt.execute();  

        ResultSet rs = pstmt.getResultSet();

        int i =0;
        DefaultListModel listModel = new DefaultListModel();

        while(rs.next())
        {   

            String [] data;
            data = new String[100];
            data [i] = rs.getString("date");
            jList1.setModel(listModel);
            listModel.addElement(data [i]);
            i = i+1;

        }
    } 
    catch (Exception e) 
    {
        System.out.println("2nd catch  " + e);
    }        
}

谁能告诉我我的错误在哪里? 提前谢谢..

【问题讨论】:

  • 你在结果集中得到任何值吗?
  • 没有结果集也是空白的..我认为我的查询卡住了我
  • 请分享jdjd1的值
  • @kapil - 检查我的帖子,看看它是否适合你。如果需要,您需要更改格式。
  • jd 和 jd1 具有由查看器选择运行时间的动态值..

标签: java mysql swing date jdatechooser


【解决方案1】:

因为这是PreparedStatement,你可以试试:

PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date >= ? AND date <= ?");
pstmt.setDate(1,new java.sql.Date(jd.getTime()));
pstmt.setDate(2,new java.sql.Date(jd1.getTime()));
ResultSet rs = pstmt.executeQuery();

【讨论】:

  • 没有找到适合 setDate(int,java.util.Date) 方法的方法 com.mysql.jdbc.PreparedStatement.setDate(int,java.sql.Date,java.util.Calendar) 不是适用(实际和形式参数列表长度不同)方法 com.mysql.jdbc.PreparedStatement.setDate(int,java.sql.Date) 不适用(实际参数 java.util.Date 无法转换为 java.sql.Date通过方法调用转换)出现此错误
  • @kapil 查看我的更新答案。问题是 setDate 需要一个 java.sql.Date
  • 是的,它有效.. 非常感谢你的朋友..:)
  • @dan.. 现在我想要 JList 中的记录而不是日期,那么应该进行哪些更改?
  • @kapil 很高兴它成功了。但我不确定你所说的记录而不是日期是什么意思。也许你应该问另一个关于新细节的问题。
【解决方案2】:

您需要更改您的查询。像这样的东西:-

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String jdStr = sdf.format(jd);
String jd1Str = sdf.format(jd1);
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("SELECT date FROM invoice WHERE date >= '" + jdStr + "' AND date <= '" + jd1Str + "'");

之前,在您的查询中,jdjd1 这两个参数没有被追加。此更改现在会将其附加到查询中。问题在于 jd &amp; jd1 未正确附加到查询中。

注意:-我添加了一个 SDF,以便您可以将日期格式化为所需的格式并将其附加到查询中。

【讨论】:

  • 不以这种方式显示所有记录,而不是仅在两个日期之间的特定记录..
  • 然后确保您的日期是正确的!我没有看到任何其他问题,为什么它应该获取所有内容!
【解决方案3】:

你需要把jList1.setModel(listModel);从循环中取出

while(rs.next())
    {   

        String [] data;
        data = new String[100];
        data [i] = rs.getString("date");
        //jList1.setModel(listModel);
        listModel.addElement(data [i]);
        i = i+1;

       }

jList1.setModel(listModel);

【讨论】:

  • 按照 RJ 的回答中提到的步骤,然后我的从循环中删除 setModel 语句
【解决方案4】:

您确定 SQL 中的日期和 java.util.Date 中的日期格式相同吗?

尝试使用

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(todaysDate);

检查它们是否相同。

jd 和 jd1 默认会因 SQL 日期 @see SQL Dates 而不同

【讨论】:

    【解决方案5】:

    这不是使用PreparedStatement 的正确方法,它已经准备好处理日期,因此您不应将它们转换为字符串。您的代码应如下所示:

    PreparedStatement pstmt = ...
    pstmt.setDate(...)
    

    另外,您的查询字符串 没有真正使用 jd 作为变量,您误用了 ' 和 "

    【讨论】:

      【解决方案6】:
      1. 永远不要在长期运行的JDBC 内部创建GUI Objects,也不要在try - catch - finally 内部创建一个GUI Objects,除非这些对象永远不会被创建

        李>
      2. DefaultListModel listModel = new DefaultListModel(); 应该创建一个局部变量,然后不需要在运行时重新创建一个新的XxxListModel

      3. 必须从listModel 中删除所有元素,否则新的Items 将附加到JList 的末尾

      4. String [] data;data = new String[100];data [i] = rs.getString("date");while(rs.next()) { 中的定义是非常无用的,因为数据库记录是从这个数组存储在 XxxListModel 中的,并且可以用于其他地方的其他用途

      5. ConnectionPreparedStatementResultSet 应在 finally block 中关闭(try - catch - finally),否则这些 Objects 会在 @ 中保留(并增加) 987654344@内存,

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 2012-10-17
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2017-03-27
        相关资源
        最近更新 更多