0

您好必须检索数据库的一条记录,该记录应尽可能接近我的参数(日期(YYYY-MM)),请记住数据库(sql server)中的列是DATETIME,所以我需要格式化它以便我可以比较它,这是我一直在做的:

public Document findByDate(String date) throws GeneralException{
    Document docs = new Document();
    String d1 = date;
    String delimiter = "-";
    String[]temp = d1.split(delimiter);     
    try{
        String sql = "SELECT TOP(1) *  FROM Document  WHERE issueDate >= '" +   temp[1]+ temp[0] +"'  AND issuedate < '"+ temp[1]+ temp[0] +"'  ORDER BY issueDate DESC ";
        ResultSet rs = this.executeQuery(sql);
        while(rs.next()){
            docs = (Document) this.build(rs);
        }
        if(docs != null){
            return docs;
        } else {
            return docs = null;
        }
    } catch (SQLException ex){
        throw new GeneralException(ex);
    }
}

非常感谢你

4

3 回答 3

1

您不应该使用字符串连接将参数传递给查询。这很容易出错,依赖于数据库和语言环境,并使您的代码容易受到 SQL 注入攻击。相反,使用准备好的语句,并将您的日期参数作为 java.sql.Date 传递,而不是将其作为字符串传递:

String sql = 
    "SELECT TOP(1) * FROM Document WHERE issueDate >= ? AND issuedate < ? ORDER BY issueDate DESC";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setDate(1, date);
stmt.setDate(2, date);
ResultSet rs = stmt.executeQuery();

也就是说,我看不出您的查询可能如何工作。数据库中的日期如何既小于或等于给定日期又大于同一日期?也许您应该使用您的日期作为最低界限,而您的日期 + 1 个月作为上限?

于 2012-05-10T21:34:11.733 回答
0

试试这个查询

SELECT TOP(1) *  FROM Document  WHERE convert(date,issueDate) >= ' datevalue ' AND convert(date,issuedate) < ' datevalue '  ORDER BY issueDate DESC 
于 2012-05-10T21:53:23.917 回答
0

所以你想要的是同一个月或上个月的最新记录,当然我们必须记住,12月之前的月份是去年......

您可能会在比较月份和年份时搞砸,但如果不是在 YYYY-MM 中传递,而是在该月底传递,那么它只是

Select Top(1) * from Documents Where IssueDate <= ? Order By IssueDate Desc

在哪里 ?是月底

于 2012-05-10T21:54:46.430 回答