Java 使用JDBC在SQL中搜索日期?

Java 使用JDBC在SQL中搜索日期?,java,sql,jdbc,Java,Sql,Jdbc,我目前正在编写一个JavaSwing应用程序,它从MYOB数据库文件中读取数据,并在表中显示某些信息。我已经能够成功地生成所需的SQL语句,但是在添加日期之间搜索的功能时遇到了问题(我们的数据库非常大,因此我们试图限制结果)。下面是我的一个查询示例(用Java编写): 我有两个日期(它们实际上是Java中的字符串,但格式为dd/MM/yyyy) 我曾尝试在我的WHERE语句中使用另一个AND子句和BETWEEN语句,但从JDBC[MYOB ODBC]获取正确操作数的文本值时出现以下错误。 实际报

我目前正在编写一个JavaSwing应用程序,它从MYOB数据库文件中读取数据,并在表中显示某些信息。我已经能够成功地生成所需的SQL语句,但是在添加日期之间搜索的功能时遇到了问题(我们的数据库非常大,因此我们试图限制结果)。下面是我的一个查询示例(用Java编写):

我有两个日期(它们实际上是Java中的字符串,但格式为dd/MM/yyyy)

我曾尝试在我的
WHERE
语句中使用另一个
AND
子句和
BETWEEN
语句,但从JDBC
[MYOB ODBC]获取正确操作数的文本值时出现以下错误。

实际报表如下:

rs = stmt.executeQuery("SELECT sales.InvoiceNumber, sales.ShipToAddress, sales.Date "
                        + "FROM sales, customers "
                        + "WHERE sales.CardRecordID = customers.CardRecordID "
                        + "AND customers.Name = 'Cash Sales' "
                        + "AND sales.Date BETWEEN " + sdate + " AND " + edate + " "
                        + "ORDER BY sales.ShipToAddress ASC, sales.Date DESC"
                        + ";");
有人能帮我找出正确的语法吗?这是缺失的最后一项功能


编辑:
sdate
edate
的当前值分别为2013年10月25日,因为它们默认为今天的日期。我已经设置了我正在测试的虚拟文件,以确保它将提供具有此日期范围的数据。此外,为了便于说明,我希望搜索日期包括在内。

在日期周围使用引号:

rs = stmt.executeQuery("SELECT sales.InvoiceNumber, sales.ShipToAddress, sales.Date "
            + "FROM sales, customers "
            + "WHERE sales.CardRecordID = customers.CardRecordID "
            + "AND customers.Name = 'Cash Sales' "
            + "AND sales.Date BETWEEN '" + sdate + "' AND '" + edate + "' "
            + "ORDER BY sales.ShipToAddress ASC, sales.Date DESC"
            + ";");
或者使用预先准备好的语句可能更安全(例如,如果日期来自不受信任的输入):

between运算符是包含的,但如果数据库字段实际上是时间戳,则假定没有时间的日期为时间00:00:00.000。因此,在这种情况下,为了使您的日期包含在内,您可以在结束日期的基础上增加一天。从技术上讲,它还包括第二天的第一个瞬间(00:00:00.000小时),但取决于您的应用程序,它可能就足够了


否则,您可以在“开始日期”上使用
=
,并且
看起来您需要用以下格式表示日期:

从日期字段位于“2006-10-01”和“2006-11-30”之间的表中选择*


还有,别忘了谷歌是你的朋友

sdate和edate的值是什么?目前的日期是2013年10月25日(这也是日期的标准格式,通常是dd/MM/yyyy),我不确定,但可能需要将字符串转换为日期。像
。。。在CAST(“+sdate+”“AS DATE)
之间,因此onI能够通过添加
并将日期格式更改为
yyyy/MM/dd
来解决问题。我现在唯一的问题是中间查询不包含日期,我最好使用
=
@gRnt
中间查询包含日期。您确定您的销售日期实际上是
日期
,而不是
时间戳
(因此它包含时间)?如果是
时间戳
,则将
日期
提升为
时间戳
(如
yyyy-MM-dd 00:00:00.00000
中所述,因此中间条件将不包括日期与
00:00:00.00000
之后出现的上限相同的项。请注意,某些数据库使用术语
date
(在SQL标准和JDBC中)
TIMESTAMP
。不应使用字符串连接。这为SQL注入和其他操作打开了大门。请改用
ps.setXXX(…)
rs = stmt.executeQuery("SELECT sales.InvoiceNumber, sales.ShipToAddress, sales.Date "
            + "FROM sales, customers "
            + "WHERE sales.CardRecordID = customers.CardRecordID "
            + "AND customers.Name = 'Cash Sales' "
            + "AND sales.Date BETWEEN '" + sdate + "' AND '" + edate + "' "
            + "ORDER BY sales.ShipToAddress ASC, sales.Date DESC"
            + ";");
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date startDate = formatter.parse(sdate);
java.util.Date endDate = formatter.parse(edate);
PreparedStatement pstmt = connection.prepareStatement("SELECT sales.InvoiceNumber, sales.ShipToAddress, sales.Date "
            + "FROM sales, customers "
            + "WHERE sales.CardRecordID = customers.CardRecordID "
            + "AND customers.Name = 'Cash Sales' "
            + "AND sales.Date BETWEEN ? AND ? "
            + "ORDER BY sales.ShipToAddress ASC, sales.Date DESC");
pstmt.setDate(1, new java.sql.Date(startDate.getTime()))
pstmt.setDate(2, new java.sql.Date(endDate.getTime()))
"sales.Date >= '" + sdate + "' AND sales.Date < '" + edatePlusOne + "' "
Class.forName("com.mysql.jdbc.Driver");

connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospitall","root","");

PreparedStatement ps=connection.prepareStatement("select * from patient where patientid='"+txtpatientid.getText()+"'");

Statement stm=connection.createStatement();

ResultSet rs=ps.executeQuery();

if(rs.next()){

String patientid=txtpatientid.getText(); 

String str="select * from patient where patientid='"+patientid+"'";

ResultSet result=stm.executeQuery(str);