Как передать строку с ' ' (отметка времени) в подготовленном выражении?

Я пытаюсь выполнить следующий запрос

INSERT INTO hotspot(timestamp) VALUES 
(timestamp with time zone '2012-10-25 14:00:00 +05:00' at time zone 'EET');

и я хочу передать метку времени в качестве переменной.

Мой столбец отметок времени - это тип отметки времени с часовым поясом.

Ты хоть представляешь, как это можно сделать?

Когда я делаю... (Java, Postgresql)

    String stm= "INSERT INTO hotspot(timestamp) VALUES(timestamp with time zone ? at time zone 'EET')";
    pst = con.prepareStatement(stm);
    pst.setString(1, "2012-08-24 14:00:00 +05:00");
    pst.executeUpdate();

Я получаю синтаксическую ошибку на уровне или около $1

Есть ли в любом случае я могу преодолеть эту ошибку?? Заранее спасибо!!

Обновление: я попытался использовать setTimestamp следующим образом...

Calendar c=Calendar.getInstance(TimeZone.getTimeZone("GMT+05:00"));
String stm= "INSERT INTO hotspot(timestamp) VALUES(?)";
pst = con.prepareStatement(stm);
pst.setTimestamp(1,Timestamp.valueOf("2012-01-05 14:00:00"), c );
pst.executeUpdate();

Я полагаю, что правильное значение в БД должно быть (учитывая, что мой местный часовой пояс EET (+02))

2012-01-05 11:00:00 +02

но с помощью pgadmin я проверяю значение и получаю

2012-01-05 14:00:00 +02

Какие-либо предложения?

2 ответа

Решение

Попробуйте использовать метод setTimestamp() вместо метода setString(). Проверьте эту ссылку, чтобы понять, как использовать PreparedStatement.

Изменить: как я объяснил в комментарии, проверьте ссылку API для setTimestamp() с тремя параметрами:

Устанавливает для указанного параметра указанное значение java.sql.Timestamp, используя данный объект Calendar. Драйвер использует объект Calendar для создания значения SQL TIMESTAMP, которое драйвер затем отправляет в базу данных. С помощью объекта Calendar водитель может рассчитать временную метку с учетом пользовательского часового пояса. Если объект Calendar не указан, драйвер использует часовой пояс по умолчанию, то есть виртуальную машину, на которой запущено приложение.

Федерико Кристина совершенно прав, что setTimestamp это правильный способ сделать это.

Причина синтаксической ошибки в том, что вы не можете указать тип с ведущим спецификатором типа при передаче параметра. INTEGER '4' Стиль действителен только для литералов, а не для параметров.

Ваш код будет PREPAREпотом EXECUTEг на уровне протокола. Вот что произойдет, если я PREPARE Это:

regress=> PREPARE blah(timestamptz) AS INSERT INTO hotspot(timestamp) VALUES(timestamp with time zone $1 at time zone 'EET');
ERROR:  syntax error at or near "$1"
LINE 1: ...otspot(timestamp) VALUES(timestamp with time zone $1 at time...

Так как тип данных указан в параметре запроса, вы можете его опустить, записав вместо этого:

String stm= "INSERT INTO hotspot(\"timestamp\") VALUES(? at time zone 'EET')";

Обратите внимание, что я дважды цитирую "timestamp" также, потому что это зарезервированное слово. Это будет работать без кавычек в некоторых контекстах, но не в других. Выбор имени типа данных или зарезервированного слова в качестве имени столбца, как правило, является плохой идеей.

Другие вопросы по тегам