Как получить данные 10 дней назад из таблицы по сегодняшней дате - PullRequest
0 голосов
/ 03 июня 2019

У меня есть форма, где находится окно поиска. Я хочу, после ввода сегодняшней даты в этом окне поиска и нажатия кнопки «Отправить», я получаю 10 дней назад записей из базы данных.У меня есть следующие столбцы в таблице (имя таблицы = Проблема устройств).Device_ID, Employee_id, Employee_Name, Employee_Ext, Issue_Date

Когда я использую следующий запрос и ввожу дату, которая находится в столбце Issue_Date, получая запись этой даты.pst = con.prepareStatement ("выберите * из проблемных устройств, где Issue_Date = '" + str + "');

Когда я пишу запрос, как будто ничего не происходит, pst = con.prepareStatement (" выберите * из проблемных устройств)где Issue_Date = '"+ str +"' - INTERVAL '10' DAY ");

try 
          {
                   String str = tf5.getText();
                   Connection con=DB.getConnection();
                   PreparedStatement st = con.prepareStatement("select * from issuedevices where Issue_Date=?");
                 //  PreparedStatement st = con.prepareStatement("SELECT * FROM issuedevices WHERE Issue_Date > sysdate - INTERVAL '10' DAY;");

                   st.setString(1, str);
                   ResultSet rs=st.executeQuery();

             //       Vector v = new Vector();
               if (rs.next()) 
                    {
                         frame1 = new JFrame("Database Search Result");
                         frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                         frame1.setLayout(new BorderLayout());
                        //TableModel tm = new TableModel();
                         DefaultTableModel model = new DefaultTableModel();
                         model.setColumnIdentifiers(columnNames);
                         table = new JTable();
                         table.setModel(model);
                         table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
                         table.setFillsViewportHeight(true);
                           JScrollPane scroll = new JScrollPane(table);
                           scroll.setHorizontalScrollBarPolicy(
                                   JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                           scroll.setVerticalScrollBarPolicy(
                                   JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                 //  from = (String) c1.getSelectedItem();
                             String id = "";
                             String Device_ID = "";
                             String Employee_id = "";
                             String Employee_Name = "";
                             String Employee_Ext = "";
                             String Issue_Date= "";

                try {
                      //  pst = con.prepareStatement("select * from issuedevices where Issue_Date='" + str + "'");
                       pst = con.prepareStatement("select * from issuedevices where Issue_Date BETWEEN '" + str + "' - INTERVAL '11' DAY  AND '" + str + "'");
                       // pst = con.prepareStatement("select * from issuedevices where Issue_Date = '" + str + "'- INTERVAL '10' DAY");

                        ResultSet rs1 = pst.executeQuery();

                        int i = 0;
                        if (rs1.next())
                        {
                            id = rs1.getString("id");
                            Device_ID = rs1.getString("Device_ID");
                            Employee_id = rs1.getString("Employee_id");
                            Employee_Name = rs1.getString("Employee_Name");
                            Employee_Ext=rs1.getString("Employee_Ext");
                            Issue_Date=rs1.getString("Issue_Date");

                            model.addRow(new Object[]{id, Device_ID, Employee_id,Employee_Name,Employee_Ext,Issue_Date});
                            i++;
                        }
                        if (i < 1) 
                        {
                            JOptionPane.showMessageDialog(null, "No Record Found", "Error", JOptionPane.ERROR_MESSAGE);
                        }
                        if (i == 1) 
                        {
                            System.out.println(i + " Record Found");
                        }
                        else 
                        {
                            System.out.println(i + " Records Found");
                        }
                } 
                        catch (Exception ex)
                        {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                        }
                        frame1.add(scroll);
                        frame1.setVisible(true);
                        frame1.setSize(400, 300);
                    }

                    st.close();
                    rs.close();
          } 
          catch (Exception e) 
          {
              JOptionPane.showMessageDialog(null, "Name not Found");
          }

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

java.time и JDBC 4.2

    pst = con.prepareStatement("select * from issuedevices where Issue_Date BETWEEN ? AND ?;");
    LocalDate today = LocalDate.now(ZoneId.of("Europe/Isle_of_Man"));
    pst.setObject(1, today.minusDays(10));
    pst.setObject(2, today);

Не создавайте вручную строку запроса.Используйте параметры.И не передавайте параметры даты как строки, а как LocalDate объекты.Как видно из кода, LocalDate имеет метод для вычитания 10 дней (или любого другого числа дней).

Ссылка: Учебное пособие по Oracle: Дата и время объясняя, как использовать java.time.

0 голосов
/ 03 июня 2019

Вы связываете параметр запроса в виде строки:

st.setString(1, str);

Рассмотрите возможность связывания его как Дата:

st.setDate(1, new SimpleDateFormat("YYYY-MM-DD HH:mm:ss").parse(str));

Конечно, используйте желаемый формат даты .

Вы также можете выполнить преобразование в базе данных, оставив код Java без изменений, но изменив свой запрос:

select * from issuedevices where Issue_Date=STR_TO_DATE(?, "%M %d %Y");

Дополнительно рассмотрите возможность сравнения дат с диапазонами (не используйте "=", используйте ">"вместо этого)

...