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,用户或密码)为空。
请检查那里,你应该找到一个线索。