date_trunc org.postgresql.util.PSQLException:错误:语法错误在“$ 1”或附近

运行此Java / JDBC代码时出现此错误。 任何想法如何绕过它?

好像它在抱怨date_trunc函数中的参数?

org.postgresql.util.PSQLException:错误:语法错误在“$ 1”或附近位置:100

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryEx ecutorImpl.java:2161) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutor Impl.java:1890) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.ja va:255) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Stat ement.java:560) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(Abstract Jdbc2Statement.java:417) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc 2Statement.java:302) 

Java代码:

 static PreparedStatement searchErrorPP = connection.prepareStatement( "select count(*) from tracking where date_trunc('day', run_date) <= date_trunc('day', timestamp ?)"); public static int queryCount(java.util.Date date) throws SQLException { PreparedStatement ps = null; try { ps = searchErrorPP; ps.setDate( 1, new java.sql.Date(date.getTime())); ResultSet rs = ps.executeQuery(); 

生成的查询在pgAdmin中执行正常:

 select count(*) from tracking where date_trunc('day', run_date) <= date_trunc('day', timestamp '2014-11-11 -05:00:00') 

timestamp '2014-11-11 -05:00:00'使用type 'string'语法timestamp '2014-11-11 -05:00:00' ,提供的值必须是常量,而不是参数。 在实际执行之前和参数值已知之前,SQL引擎在解析阶段将其解释并转换为内部时间戳表示。

因此,当遇到timestamp $1 ,解析器会产生语法错误,因为$1不是文字字符串。

另一方面, cast($1 as timestamp)的值cast($1 as timestamp)将在执行阶段产生,因此这应该是应该使用的。

至于从JDBC的角度来看语法, cast(? as timestamp)应该没问题。 具有双冒号的PostgreSQL特定语法?::timestamp也可能有效。

当任何一个jdbc连接url组件为null时,我都看到过这样的错误。

例如,连接URL组件(如DB主机名,dbname,用户或密码)为空。

请检查那里,你应该找到一个线索。