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

sv.*_*sv. 9 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)
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*ité 15

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

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

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

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