2014-03-18 115 views
1

我想筛选我的表以按月显示记录,所以我为用户输入制作文本框。现在我不知道我的查询是否正确。我没有任何错误,但也没有任何结果。我使用LIKE,因为我没有提供特定的日子。有人可以提出更好的方法吗?使用LIKE搜索仅有年份和月份的日期

enter image description here

enter image description here

ConnectToDatabase conn = null; 
conn = ConnectToDatabase.getConnectionToDatabase(); 
String query = "Select * from inventoryreport where InDate LIKE "+txtYear.getText()+""+ txtMonth.getText()+""; 
conn.setPreparedStatement(conn.getConnection().prepareStatement(query)); 
conn.setResultSet(conn.getPreparedStatement().executeQuery()); 
     java.sql.ResultSetMetaData metaData = conn.getResultSet().getMetaData(); 
     int columns = metaData.getColumnCount(); 
     for (int i = 1; i <= columns; i++) { 
      columnNames.addElement(metaData.getColumnName(i)); 
     } 
+0

您必须正确使用'PreparedStatement'来防止sql注入。 –

+0

你的查询解析为'SELECT * FROM inventoryreport WHERE InDate LIKE 201403'这就是你想要的东西? – Kon

+1

如果该列是* proper * DATE/DATETIME类型,则不需要使用'LIKE'。相反,只需比较'x> = startOfPeriod && x user2864740

回答

1

喜欢它是错的choise becouse你的数据库不使用索引,将是缓慢的(和不工作)。 查询是这样的:

SELECT * FROM inventoryreport WHERE YEAR(Date_column) = 2014 AND MONTH(Date_column) = 3; 

所以,你的代码是:

String query = "Select * from inventoryreport where YEAR(InDate) = " +txtYear.getText()+" AND MONTH(InDate) = "+ txtMonth.getText(); 
0

我认为这是在日期格式的一个小错误:

Your format : YYYYMM (no seperation symbol) 
Right format: YYYY-MM-DD (with a '-' to seperate) 

我觉得

String query = "Select * from inventoryreport where InDate LIKE "+txtYear.getText()+"-"+ txtMonth.getText()+"-00"; 

SH如果你的数据库只包含每月的精确值,那么应该修复它。

否则应该使用

Select * from inventoryreport where InDate BETWEEN '2014-03-18' AND '2014-03-20' 
+0

如果2014-03-18不是静态的并且需要用户定义为no只有日,月和年? – Rohan21

+0

你只需要像你在你的例子中那样做:String query =“Select * from inventoryreport where InDate between”+ txtYear.getText()+“ - ”+ txtMonth.getText()+“ - 01”and“+ txtYear.getText()+“ - ”+(new Integer(txtMonth.getText())。intValue()+ 1)+“ - 01”; –

+0

如果txtMonth = 12,则previuos注释中的代码不起作用。 – lquitadamo

0

一个SQL查询可以利用索引的优势,当在不被周围的功能列。下面where条款将允许使用索引:

SELECT * 
FROM inventoryreport 
WHERE Date_Column >= str_to_date(concat_ws('-', txtYear.getText(), txtMonth.getText(), '01'), '%Y-%m-%d') and 
     Date_Column < adddate(str_to_date(concat_ws('-', txtYear.getText(), txtMonth.getText(), '01'), '%Y-%m-%d'), interal 1 month) 

虽然比较复杂,所有的操作都在常数,所以查询引擎仍然可以对Date_Column指数的优势。

相关问题