дата trunc org.в PostgreSQL.утиль.PSQLException: ERROR: синтаксическая ошибка В или около " $1"

Я получаю эту ошибку при запуске этого кода Java/JDBC. Есть идеи, как обойти это?

похоже, он жалуется на параметр в функции date_trunc?

org.в PostgreSQL.утиль.PSQLException: ERROR: синтаксическая ошибка при или около "$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 ответов


при использовании type 'string' синтаксис как в timestamp '2014-11-11 -05:00:00', указанное значение должно быть константой, а не параметр. Он интерпретируется и преобразуется во внутреннее представление метки времени SQL engine на этапе синтаксического анализа, до фактического выполнения и до того, как значения параметров известны.

так что при встрече timestamp , синтаксический анализатор выдает синтаксическую ошибку, потому что - это не строковый литерал.

С другой стороны, значение cast( as timestamp) будет производиться на этапе выполнения, так это то, что должно быть использовано.

что касается синтаксиса с точки зрения JDBC,cast(? as timestamp) должно быть нормально. Специфический синтаксис PostgreSQL ?::timestamp с двойными двоеточиями также, вероятно, работает.


Я видел такую ошибку, когда любой из компонентов url-адреса соединения jdbc равен нулю.

например. компоненты url соединения, такие как имя хоста БД, имя БД, пользователь или пароль, имеют значение null.

пожалуйста, проверьте там, и вы должны найти ключ.