无法获得两个日期之间的记录

时间:2013-04-23 09:28:43

标签: java mysql swing date jdatechooser

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

我有两个JDateChooser个。当我选择两个日期,如'10 -apr-2011'到'20 -apr-2011'时,我希望这些日期之间的所有记录都显示在我的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);
    }        
}

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

6 个答案:

答案 0 :(得分:3)

由于这是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();

答案 1 :(得分: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 + "'");

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

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

答案 2 :(得分:2)

你需要从循环中取出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);

答案 3 :(得分:2)

  1. 永远不会在艰难且长期运行的GUI Objects内部,也不会在JDBC - try - catch内部创建finally。永远不会被创造

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

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

  4. 的末尾
  5. String [] data;的定义以及data = new String[100];内的data [i] = rs.getString("date");while(rs.next()) {都是无用的,因为数据库记录是从XxxListModel中的此数组存储的,并可供其他地方使用

  6. ConnectionPreparedStatementResultSet应在finally block try - catch - finally中关闭),其他ObjectsJVM记忆中保持(并且增加),

答案 4 :(得分:1)

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

尝试使用

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

检查它们是否相同。

默认情况下,jd和jd1因SQL日期@see SQL Dates

而不同

答案 5 :(得分:1)

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

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

你的查询字符串并没有真正使用jd作为变量,你误用'和'