【问题标题】:How to Pass Array of Timestamps to Postgres Function using Java/JDBC?如何使用 Java/JDBC 将时间戳数组传递给 Postgres 函数?
【发布时间】:2012-05-20 07:28:16
【问题描述】:

如何使用 Java 和 JDBC 将时间戳数组传递给 Postgres 函数?

这是函数的签名:

CREATE OR REPLACE FUNCTION getlistcount(_id integer, _subs text, _download_array timestamp without time zone[], _filter integer, _fault text) RETURNS refcursor AS...

这是创建数组的 Java 代码:

GregorianCalendar[] dataDownloads = 
        downloadTimes.toArray(new GregorianCalendar[downloadTimes.size()]);

Array sqlArray = conn.createArrayOf("timestamp", dataDownloads);
cstmt.setArray(4, sqlArray);

downloadTimes 是传递给 Java 函数的 List。

提示:我们需要将时间与日期连接起来,根据Postgres documentation。

【问题讨论】:

  • 我看到您使用的是TIMESTAMP WITHOUT TIME ZONE。在几乎所有用例中,TIMESTAMP WITH TIME ZONE 更好;它代表一个实际的时刻,而另一个不代表。
  • @KGrittn,这是有道理的。我们从下载时间(见下文)获取时区,用时间戳保存时区。谢谢!

标签: java postgresql jdbc postgresql-9.1


【解决方案1】:

我找到了an answer on StackOverflow that is similar,但使用的是 PreparedStatement 而不是 JDBC 表示法。

//Get timezone from first entry, assuming all same timezone
if(!downloadTimes.isEmpty()) {
    cal.setTimeZone(downloadTimes.get(0).getTimeZone());
}

//Create an array of timestamps
java.sql.Timestamp [] array = new java.sql.Timestamp [downloadTimes.size()];

for(int i=0; i < array.length; i++) {
    array[i] = new java.sql.Timestamp(downloadTimes.get(i).getTimeInMillis());
} 

//pass the array to JDBC call
//conn is the connection, and cstmt is the CallableStatement
Array sqlArray = conn.createArrayOf("timestamp", array);
cstmt.setArray(4, sqlArray);

【讨论】:

    【解决方案2】:

    数组不必是旧的 java.sql.Timestamp 类,您可以改用 java.time 类。

    这样

    LocalDateTime[] localTimes = new LocalDateTime[]{LocalDateTime.now()};
    Array sqlArray = conn.createArrayOf("timestamp", localTimes);
    cstmt.setArray(4, sqlArray);
    

    对于 带区域的时间戳,请使用 java.time.OffsetDateTime

    【讨论】:

    • 感谢@david-lilljegren 使用更新的代码进行更新。是的,这是带有时区的时间戳的最佳实践。
    • Postgres JDBC 驱动程序会删除时区信息,如果将timestamp 类型传递给createArrayOf 方法。使用 timestamptz 类型可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2014-10-20
    • 2023-03-20
    • 2012-10-30
    • 1970-01-01
    • 2019-02-26
    • 2023-03-24
    相关资源
    最近更新 更多