2014-03-18 111 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指數的優勢。

相關問題