使用LIKE仅搜索包含年份和月份的日期

时间:2014-03-18 23:57:29

标签: java mysql sql database

我想过滤我的表以按月显示记录,因此我为用户输入创建了一个文本框。现在我不知道我的查询是否正确。我没有任何错误,但也没有任何结果。我使用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));
        }

3 个答案:

答案 0 :(得分:1)

喜欢它是错误的选择,因为你的数据库不使用索引并且会很慢(并且不起作用)。 查询是这样的:

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();

答案 1 :(得分: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";
如果您的数据库仅包含每月确切值,则应该修复它。

否则你应该使用

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

答案 2 :(得分: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上的索引。