如何按日期范围查询数据库
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
开头无效,应引用 January
和 February
,但是,由于您尝试使用 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 某些东西并且您的查询对于您尝试获取的数据有效
我正在制作一个 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
开头无效,应引用 January
和 February
,但是,由于您尝试使用 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 某些东西并且您的查询对于您尝试获取的数据有效