2016-07-07 43 views
1

我一直在想如何得到這個權利,但沒有運氣幾個SQL語句。我試過between>= and =<。基本上,我使用的SQL語句正在工作,但只在一定程度上。我的代碼是這樣工作的:用戶將選擇一個日期範圍(從日期到日期),程序將檢索並顯示它在這些範圍內的數據。就像我說的那樣,它可以工作,但它也顯示了其他月份的日子,我想要展示的只是用戶選擇的特定日子。例如。從2016年7月1日到2016年7月5日。發生的事情是一年中的任何一個月份都會顯示這些日期,這使得這種方法有點無用。SQL Statement - Java

任何幫助或任何解釋爲什麼這是如此,將不勝感激。

下面是我的代碼:

stringFromDate = sdf.format(fromDate.getDate()); 

stringToDate = sdf.format(toDate.getDate()); 

String query = "Select * from tblSavings where date between '" + stringFromDate+ "' and '" + stringToDate+"'"; 

try{ 

    pstmt = conn.prepareStatement(query); 

    rs = pstmt.executeQuery(); 

    tblList.setModel(DbUtils.resultSetToTableModel(rs)); 
+3

[SQL注入警報](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29。 aspx) - 您應該**不**將您的SQL語句連接在一起 - 使用**參數化查詢**來代替以避免SQL注入 –

+3

'stringFromDate'和'stringToDate'的格式很可能不正確,這就是查詢無法正常工作的原因。更新並顯示正在執行的實際原始查詢。另外,正在使用什麼版本的SQL? –

+0

@marc_s我在看你現在給我的鏈接。謝謝。 – joppiealiw

回答

1

好像你正試圖在這裏重新發明輪子。 PreparedStatement正是爲這個用例創建的 - 在預定義的結構中設置變量值。在你的情況下,用setDate方法。從我猜的背景下您的fromDatetoDate變量java.util.Date情況下,所以你必須將它們轉換爲java.sql.Date小號

java.sql.Date fromDateToBind = new java.sql.Date(fromDate); 
java.sql.Date toDateToBind = new java.sql.Date(toDate); 

String query = "Select * from tblSavings where date between ? and ?"; 

try{ 
    pstmt = conn.prepareStatement(query); 
    pstmt.setDate(1, fromDateToBind); 
    pstmt.setDate(2, toDateToBind); 
    rs = pstmt.executeQuery(); 

    // use the results... 
} // etc... 
使用
+0

我已經使用了Tim提出的建議並運行了。我也會記住這一點,並會嘗試下一個我將要製作的項目。謝謝! – joppiealiw

1

您可以使用SimpleDateFormat得到一個字符串這是在正確的格式如在SQLite的日期,以適當的格式被yyyy-MM-dd

String pattern = "yyyy-MM-dd"; 
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); 
String stringFromDate = dateFormat.format(fromDate.getDate()); 
+1

這個修好了!非常感謝! – joppiealiw