0

こんにちは、データベースの 1 つのレコードを取得する必要があります。このレコードは、私のパラメーター (日付 (YYYY-MM)) にできるだけ近い必要があります。データベース (SQL サーバー) の列は 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 に答える