2012-08-08 120 views
-1

我正在使用MS-SQL Server。我在Convert附近發生異常。這裏是我的查詢:如何將字符串轉換爲SQL查詢中的日期?

String query1="select * from pat.dbo.Demand_Register 
       where (select (Convert (datetime,Payment_Date,103)) as pd 
         from pat.dbo.Demand_Register) 
        between '"+frmDate1+"' and '"+toDate1+"' "; 

和異常:

java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Syntax error converting datetime from character string. 
+3

有什麼例外? – emaillenin 2012-08-08 05:26:29

+0

首先你缺少雙引號,它應該是這樣的''「+ frmDate1 +」''' – 2012-08-08 05:52:30

+0

java.sql.SQLException:[Microsoft] [用於JDBC的SQLServer 2000驅動程序] [SQLServer]從字符轉換datetime的語法錯誤字符串發生此異常。 – 2012-08-08 07:31:14

回答

1

這可能是因爲你使用串聯單引號您的字符串應該有雙引號爲好;看看你的字符串中如何結合frmDate1toDate1參數。

所以這應該工作

String query1 = "select * from pat.dbo.Demand_Register where (select (Convert(datetime,Payment_Date,103)) as pd from pat.dbo.Demand_Register) between '" + frmDate1 + "' and '" + toDate1 + "' "; 
+0

這是一個很好的觀察結果,通常很難找到,但我想這可能不是重點,因爲他的IDE(如果他使用的話)可能會讓他顯而易見 – Vamsi 2012-08-08 05:46:35

1

你的說法是不必要的複雜,你可以簡化到:

String query1="select * from pat.dbo.Demand_Register " + 
       "where Convert (datetime,Payment_Date,103) " + 
       "between '"+frmDate1+"' and '"+toDate1+"' "; 

但這仍然不是一個好主意。你應該從frmDate1toDate1來構建java.sql.Date實例,並在PreparedStatement使用它們:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
java.sql.Date from = new java.sql.Date(sdf.parse(frmDate1)); 
java.sql.Date to = new java.sql.Date(sdf.parse(toDate1)); 
String query1="select * from pat.dbo.Demand_Register " + 
       "where Payment_Date between ? and ?"; 
PreparedStatement stmt = connection.prepareStatement(); 
stmt.setDate(1, from); 
stmt.setDate(2, to); 
ResultSet rs = stmt.executeQuery(); 

你不僅會保護你免受SQL注入,它也可能會更快作爲一個潛在的指數Payment_Date都可以使用。