如何按日期范围查询数据库

How to query a database by date range

我正在制作一个 Java 程序,它将确定 JComboBox 值设置为默认值,让用户输入以在每日、每周、每月和每年中进行选择。现在我每月都有一个想法,但我的查询返回异常错误。这是我的代码。

            Calendar timer = Calendar.getInstance();
            timer.getTime();
            int month = timer.get(Calendar.MONTH);
            int year = timer.get(Calendar.YEAR);        
            int day = timer.get(Calendar.DAY_OF_YEAR);
            int week = timer.get(Calendar.WEEK_OF_YEAR);

            String combovalue = comboBox.getSelectedItem().toString();

               if(combovalue.equals("Monthly")) {
                try {
                    String sql = "SELECT * FROM sales WHERE date between January and February";
                    pst = connection.prepareStatement(sql);
                    pst.setString(1, String.valueOf(day));
                    rs = pst.executeQuery();
                    table.setModel(DbUtils.resultSetToTableModel(rs));
                    pst.close();
                    JOptionPane.showMessageDialog(null, "Monthly" );
                    }catch (Exception e1) {
                        JOptionPane.showMessageDialog(null, e1 );
                    }

定义 Sales.date 和/或尝试 TRUNC(date) 函数。或者使用像

这样的数值

在“2018 年 1 月 1 日”和“2018 年 2 月 1 日”之间。

记得在日期前后插入 '' 标记。

您需要在数值中将日期写为“01-01-2018”,将二月写为“02-01-2018”,这样 SELECT * FROM sales WHERE date between '01-01-2018' and '02-01-2018'

Calendar timer = Calendar.getInstance();
            timer.getTime();
            int month = timer.get(Calendar.MONTH);
            int year = timer.get(Calendar.YEAR);        
            int day = timer.get(Calendar.DAY_OF_YEAR);
            int week = timer.get(Calendar.WEEK_OF_YEAR);

          String combovalue = comboBox.getSelectedItem().toString();

               if(combovalue.equals("Monthly")) {
                try {
                    String sql = "SELECT * FROM sales WHERE date between 01-01-2018 and 02-01-2018";
                    pst = connection.prepareStatement(sql);
                    pst.setString(1, String.valueOf(day));
                    rs = pst.executeQuery();
                    table.setModel(DbUtils.resultSetToTableModel(rs));
                    pst.close();
                    JOptionPane.showMessageDialog(null, "Monthly" );
                    }catch (Exception e1) {
                        JOptionPane.showMessageDialog(null, e1 );
                    }

让我们从……开始吧

String sql = "SELECT * FROM sales WHERE date between January and February";
pst = connection.prepareStatement(sql);
pst.setString(1, String.valueOf(day));

sql 开头无效,应引用 JanuaryFebruary,但是,由于您尝试使用 PreparedStatement,所以有没有参数,所以 pst.setString(1, String.valueOf(day)); 会失败...我的意思是,参数 1 在哪里?

我建议仔细看看 Using Prepared Statements

相反,您应该使用 ...

String sql = "SELECT * FROM sales WHERE date between ? and ?";
try (PreparedStatement pst = connection.prepareStatement(sql)) {
    pst.setString(1, new java.sql.Date(fromDate.getTime()));
    pst.setString(2, new java.sql.Date(toDate.getTime()));
    try (ResultSet rs = pst.executeQuery()) {
        table.setModel(DbUtils.resultSetToTableModel(rs));
    }
    JOptionPane.showMessageDialog(null, "Monthly");
} catch (SQLException exp) {
    JOptionPane.showMessageDialog(null, ep);
}

这假定 sales.date 是一个实际的 date/time 类型。

有很多方法可以获取 start/end 日期,其中一种更好的方法是使用较新的 Date/Time API,而不是已失效的 [=23] =] API,例如...

LocalDate startDate = LocalDate.of(year, Month.JANUARY, 1);
LocalDate endDate = startDate.plusMonths(1);

然后您需要使用...

pst.setString(1, java.sql.Date.valueOf(startDate));
pst.setString(2, java.sql.Date.valueOf(endDate));

使它们与 java.sql.Date

兼容

已更新...

为了验证我没有发疯,我写了这个简单的测试 class...

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.Month;

public class Test {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        try (Connection con = DriverManager.getConnection("jdbc:h2:mem:test")) {
            con.setAutoCommit(true);
            String make = "create table if not exists Test (id bigint identity, value date)";
            try (Statement stmt = con.createStatement()) {
                stmt.execute(make);
            }
            try (Statement stmt = con.createStatement()) {
                System.out.println(">> Remove " + stmt.executeUpdate("delete from test") + " rows");
            }
            LocalDate ld = LocalDate.of(2017, Month.DECEMBER, 25);
            for (int index = 0; index < 100; index++) {
                insert(con, ld);
                ld = ld.plusDays(5);
            }
            try (Statement stmt = con.createStatement()) {
                try (ResultSet rs = stmt.executeQuery("select count(*) from test")) {
                    while (rs.next()) {
                        int count = rs.getInt(1);
                        System.out.println("Found " + count + " rows");
                    }
                }
            }

//          String sql = "select value from test";
//          try (PreparedStatement stmt = con.prepareStatement(sql)) {
//              try (ResultSet rs = stmt.executeQuery()) {
//                  while (rs.next()) {
//                      System.out.println(rs.getObject(1));
//                  }
//              }
//          }

            LocalDate startDate = LocalDate.of(2018, Month.JANUARY, 1);
            LocalDate endDate = startDate.plusMonths(1);
            String sql = "select value from test where value between ? and ?";
            try (PreparedStatement stmt = con.prepareStatement(sql)) {
                stmt.setDate(1, java.sql.Date.valueOf(startDate));
                stmt.setDate(2, java.sql.Date.valueOf(endDate));
                System.out.println(startDate);
                System.out.println(endDate);
                try (ResultSet rs = stmt.executeQuery()) {
                    while (rs.next()) {
                        java.sql.Date date = rs.getDate(1);
                        System.out.println(date);
                    }
                }
            }
        }
    }

    public static void insert(Connection con, LocalDate ld) throws SQLException {       
        String sql = "insert into test (value) values (?)";
        try (PreparedStatement stmt = con.prepareStatement(sql)) {
            java.sql.Date date = java.sql.Date.valueOf(ld);
            stmt.setDate(1, date);
            stmt.executeUpdate();
        }
    }

}

它在内存数据库中使用 H2 Database Engine,用 2017 年 12 月 25 日到 2019 年 5 月 9 日的 100 个日期填充它。

然后查询 2018 年 1 月 1 日到 2018 年 2 月 1 日之间的值并打印

2018-01-01
2018-02-01
2018-01-04
2018-01-09
2018-01-14
2018-01-19
2018-01-24
2018-01-29

因此,您需要确保数据库中的值有效。如果您在 table 中没有得到任何东西,首先,验证数据库确实 returns 某些东西并且您的查询对于您尝试获取的数据有效