【问题标题】:How to query a database by date range [duplicate]如何按日期范围查询数据库[重复]
【发布时间】:2018-07-25 18:36:05
【问题描述】:

我正在制作一个 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 );
                    }

【问题讨论】:

  • String sql = "SELECT * FROM sales WHERE date between January and February"; 没有参数,所以pst.setString(1, String.valueOf(day)); 会给你问题
  • 是的,我不知道如何处理该查询.. 搜索更多代码..
  • 另外,swing 代码是否有助于我们理解您的 jdbc 问题?请阅读stackoverflow.com/help/mcve
  • 请逐字引用您的异常消息。这样的信息往往能说明很多。

标签: java sql jdbc date-range date


【解决方案1】:

让我们开始吧……

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 是一个实际的日期/时间类型。

有多种方法可以获取开始/结束日期,其中一种更好的方法是使用更新的日期/时间 API,而不是已失效的 Calendar 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兼容

更新...

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

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

因此,您需要确保您的数据库中有有效值。如果您的表中没有任何内容,请首先验证数据库是否确实返回了某些内容,并且您的查询对于您尝试获取的数据是否有效

【讨论】:

  • 我用过,但我的表显示空白结果..呵呵..我这样使用:LocalDate startDate = LocalDate.of(2018, Month.JANUARY, 14); LocalDate endDate = startDate.plusMonths(1);
  • 还有 2018 年 1 月 14 日到 2 月 14 日之间的值
  • 要添加什么值?
  • 转到您的数据库,列出sales 的所有行,验证指定日期之间是否存在值(请注意,如果您将来有销售,那么您做得很好)
  • 2018 年 2 月 14 日有值,但 1 月 14 日没有值
【解决方案2】:

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

这样的数值

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

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

【讨论】:

    【解决方案3】:

    您需要在数值之间写日期 Jan 为 '01-01-2018', Feb '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 );
                        }
    

    【讨论】:

      猜你喜欢
      • 2014-11-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多