дата 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.
пожалуйста, проверьте там, и вы должны найти ключ.