我目前正在编写一个JavaSwing应用程序,它从MYOB数据库文件中读取数据,并在表中显示某些信息。我已经能够成功地生成所需的SQL语句,但我在添加日期之间的搜索功能时遇到了麻烦(我们的数据库相当大,所以我们试图限制结果)。下面是我的一个查询示例(用Java编写):
rs = stmt.executeQuery("SELECT sales.InvoiceNumber, sales.ShipToAddress, sales.Date "
+ "FROM sales, customers "
+ "WHERE sales.CardRecordID = customers.CardRecordID "
+ "AND customers.Name = 'Cash Sales' "
+ "ORDER BY sales.ShipToAddress ASC, sales.Date DESC"
+ ";");
我有两个日期(它们实际上是Java中的字符串,但格式为dd/MM/yyyy)。
我曾尝试在我的WHERE
语句中使用另一个和
子句,使用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日,因为它们默认为今天的日期。我已经设置了我正在测试的虚拟文件,以确保它将提供具有此日期范围的数据。同样为了说明,我希望搜索日期包括在内。
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);
看起来你需要用这种格式来表达日期:
从表中选择*datefield在'2006-10-01'和'2006-11-30'之间
看看这里,别忘了谷歌是你的朋友!:)
在约会时使用引号:
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()))
之间运算符是包含的,但是如果您的数据库字段实际上是时间戳,那么没有时间的日期将被假定为时间00:00:00.000。因此,在这种情况下,为了使您的日期包含在内,您可以在结束日期中增加一天。从技术上讲,它还将包括第二天的第一个瞬间(00:00:00.000小时),但是根据您的应用程序,这可能就足够了。
否则,您可以使用
"sales.Date >= '" + sdate + "' AND sales.Date < '" + edatePlusOne + "' "
问题内容: 我需要在全文搜索和索引搜索之间进行操作: 我想在表的一列中搜索文本(如果很重要的话,该列上也可能会有一个索引)。 问题是,我想搜索列中的单词,但是我不想匹配部分。 例如,我的列中可能包含公司名称: Mighty Muck Miller and Partners Inc. Boy&Butter Breakfast company 现在,如果我搜索“ Miller ”,我想找到第一行。但是
我在使用ElasticSearch River的JDBC驱动程序从SQL Server 2012 enterprise获取数据时遇到问题。 这是我的设置: 操作系统:Windows 2008 R2 X64 ES: 1.2.1 JDK:jdk-7u60-windows-x64 JRE: jre-7u60-windows-x64 适用于SQL服务器的Microsoft JDBC驱动程序4.0 当我运行
但我得到以下错误: 我错在哪里?
问题内容: 我想知道如何使用Range-Query在Hibernate Search中按日期进行搜索,还是我必须实现任何过滤器?以下是我在Record Entity中的字段 我的要求是找到两个日期之间分析的记录,例如。2011年11月11日至2012年11月11日。我很困惑如何执行此操作。 问题答案: 您应该使用 从 和 到 的范围查询。 因为您使用 DateTools 自己创建了基于字符串的搜索
使用JDBC准备语句创建多参数搜索,以防止SQL注入攻击,提高性能。因为我在网上找不到最好的方法。 我试着自己实现如下。 null
问题内容: 我有一个数据库,其中有75,000+行,每天添加500多个条目。 每行都有标题和描述。 我创建了一个RSS feed,为您提供了特定搜索词的最新条目(例如,http://site.com/rss.rss?q = Pizza将为搜索词“ Pizza”输出RSS)。 我想知道什么是为此编写SQL查询的最佳方法。现在我有: 但是问题是执行查询需要2到10秒。 有没有更好的方法来编写查询,我是