【问题标题】:How can i insert timestamp with timezone in postgresql with prepared statement?如何使用准备好的语句在 postgresql 中插入带时区的时间戳?
【发布时间】:2012-12-03 02:00:22
【问题描述】:

我正在尝试使用准备好的语句将包含日期、时间和时区的字符串插入到我的数据库的时区字段的时间戳中。

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

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

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

有什么办法可以克服吗? 提前致谢!

【问题讨论】:

    标签: postgresql timestamp prepared-statement timestamp-with-timezone value-of


    【解决方案1】:

    基本问题是 java.sql.Timestamp 不包含时区信息。我认为它总是被假定为“本地时区”。

    我能想到的解决方案是不在 PreparedStatement 中使用参数,而是在 SQL 中使用时区文字:

    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() 的日期格式中包含时区吗?
    • @MichelangeloVandilakis:它包含在第二个示例中(就在 ? 占位符之后)。第一个例子是不是to_timstamp()的调用,而是一个时间戳literal,它必须遵循特定的规则。
    • 可能我写的不对。我的意思是格式只包括年、月、日、小时、分钟、秒,但没有显示包含时区
    • @MichelangeloVandilakis:这就是价值中的+2
    • 是的,我不明白,但我不是指 setString() 的格式,而是 to_timestamp() 的第二个字段的格式。例如 to_timestamp(?, 'yyyy-mm-dd hh24:mi:ss Z')
    【解决方案2】:

    我相信您可以在数据库中多使用一个字段,其中包括时区。并在得到这两个字段后手动计算时间

    【讨论】:

    • 好的,这是一种可接受的方法,但我想知道是否有任何方法可以通过上述方式进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2020-02-29
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多