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

时间:2014-02-04 00:11:56

标签: java postgresql jdbc

运行此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')

2 个答案:

答案 0 :(得分:14)

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

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

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

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

答案 1 :(得分:0)

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

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

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