如何使用预处理语句在PostgreSQL中插入带有时区的时间戳?

24

我正在尝试使用预处理语句向我的数据库的带有时区时间戳字段插入一个字符串,其中包括日期、时间和时区。

问题是Timestamp.valueof函数不考虑字符串中包含的时区,因此会导致错误。所接受的格式为yyyy-[m]m-[d]d hh:mm:ss[.f...],其中没有提到时区。

这是导致错误的确切代码:

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

有没有办法克服这个问题呢?

提前致谢!

2个回答

12
基本问题是java.sql.Timestamp不包含时区信息,我认为它总是被假定为“本地时区”。 解决方案之一是在SQL中使用时区字面量,而不是在PreparedStatement中使用参数。
update foo
  set ts_col = timestamp with time zone '2012-08-24 14:00:00 +02:00'`;

另一个可能的解决方案是将格式正确的字符串传递到使用to_timestamp()的PrepareStatement中:
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");

我们不应该在to_timestamp()的日期格式中包含时区吗? - Mike Vasi
@MichelangeloVandilakis:它包含在第二个示例中(紧随“?”占位符之后)。第一个示例不是to_timstamp()的调用,而是必须遵循特定规则的时间戳文字 - user330315
也许我没有写对。我的意思是,格式仅包含年、月、日、小时、分钟、秒,但没有显示时区已包含在内。 - Mike Vasi
@MichelangeloVandilakis:那个值中的 +2 - user330315
是的,我理解了,但我的意思不是setString()的格式,而是to_timestamp()函数的第二个字段的格式。例如,to_timestamp(?, 'yyyy-mm-dd hh24:mi:ss Z')。 - Mike Vasi
显示剩余2条评论

0

我认为你可以在数据库中使用一个额外的字段,该字段包括时区信息。获取这两个字段后,手动计算时间。


好的,这是一个可接受的方法,但我想知道是否有任何通过上述提到的方式来完成它的方法。 - Mike Vasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接