2012-08-08 125 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都可以使用。