2012-05-10 50 views
0

您必須檢索數據庫的一個記錄,這個記錄應該儘可能最接近我的參數(日期(YYYY-MM)),請記住db(sql server)中的列是DATETIME,所以我需要的格式,所以我可以比較的,這裏是我一直在做的事情:如何將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); 
    } 
} 

非常感謝您

+0

日期YYYY-MM?你最接近什麼意思。接近同一個月的開始還是結束?並且它是否必須在2012-10-01的同一個月內比2010-09年末更接近於2012-09-15 –

+0

我每個月只有一個記錄,因此如果它不是實際的月份應該是前一個 –

回答

0

所以,你想要的是個最近戰績相同或前一個月,當然我們必須牢記的是,之前一個月至十二月是去年...

能否談談月份和年份比較,但是,如果除了傳遞YYYY-MM你在月底通過,亂七八糟那麼它只是

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

在哪裏?是月底

1

你不應該使用字符串連接參數傳遞給查詢。這很容易出錯,依賴於數據庫和語言環境,並且使您的代碼容易受到SQL注入攻擊。相反,使用prepared statements,並通過您的日期參數作爲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個月作爲上限?

+0

我每個月只會有一個記錄,所以如果它不是實際的月份,它應該是前一個 –

+0

這並不能解釋「a> = b和a

0

嘗試此查詢

SELECT TOP(1) * FROM Document WHERE convert(date,issueDate) >= ' datevalue ' AND convert(date,issuedate) < ' datevalue ' ORDER BY issueDate DESC