Как я могу вставить метку времени с часовым поясом в postgresql с подготовленным оператором?

Я пытаюсь вставить в метку времени с полем часового пояса моей БД строку, которая включает дату, время и часовой пояс, используя подготовленный оператор.

Проблема в том, что функция Timestamp.valueof не принимает во внимание часовой пояс, который включает строка, поэтому вызывает ошибку. Допустимый формат: гггг- [м] м- [д] д чч: мм: сс [.f ...] без указания часового пояса.

Это точный код, который вызывает ошибку:

pst.setTimestamp (2, Timestamp.valueOf ("2012-08-24 14:00:00 +02: 00"))

Есть ли способ преодолеть это? Заранее спасибо!


person Mike Vasi    schedule 03.12.2012    source источник


Ответы (2)


Основная проблема заключается в том, что java.sql.Timestamp не содержит информации о часовом поясе. Я думаю, что это всегда считается "местным часовым поясом".

Решение, которое я могу придумать, - это использовать не параметр в PreparedStatement, а литерал часового пояса в SQL:

update foo
  set ts_col = timestamp with time zone '2012-08-24 14:00:00 +02:00'`;

Другим возможным решением может быть передача правильно отформатированной строки в PrepareStatement, который использует to_timestamp ():

String sql = "update foo set ts_col = to_timestamp(?, 'yyyy-mm-dd hh24:mi:ss')"; 
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "2012-08-24 14:00:00 +02:00");
person a_horse_with_no_name    schedule 03.12.2012
comment
Разве мы не должны включить в формат даты to_timestamp () часовой пояс? - person Mike Vasi; 04.12.2012
comment
@MichelangeloVandilakis: он включен во второй пример (сразу после заполнителя ?). Первый пример - это не вызов to_timstamp(), а временная метка literal, которая должна соответствовать определенным правилам. - person a_horse_with_no_name; 04.12.2012
comment
может я не правильно написал. Я имею в виду, что формат включает только год, месяц, день, часы, минуты, секунды, но ничего, чтобы показать, что часовой пояс включен - person Mike Vasi; 04.12.2012
comment
@MichelangeloVandilakis: это +2 в значении - person a_horse_with_no_name; 04.12.2012
comment
да, я отменил это, но я имею в виду не в формате setString (), а в формате второго поля to_timestamp (). Например, to_timestamp (?, 'yyyy-mm-dd hh24: mi: ss Z') - person Mike Vasi; 04.12.2012
comment
@MichelangeloVandilakis: нет, очевидно, в этом нет необходимости. Я тоже был немного удивлен, когда попробовал. Но на самом деле для этого нет кода формата. Но, насколько я могу судить, это работает - person a_horse_with_no_name; 04.12.2012
comment
давайте продолжим обсуждение в чате - person Mike Vasi; 04.12.2012

Я считаю, что вы могли бы использовать еще одно поле в своей базе данных, которое будет включать часовой пояс. И вычислите время вручную после того, как получите эти два поля.

person mariosk89    schedule 03.12.2012
comment
Хорошо, это приемлемый подход, но я хотел бы знать, есть ли способ сделать это указанным выше способом. - person Mike Vasi; 03.12.2012