1

如何使用 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 函数的列表。

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

4

2 回答 2

2

在 StackOverflow 上找到了一个类似的答案,但使用的是 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);
于 2012-05-11T17:43:54.993 回答
1

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

像这样

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

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

于 2019-11-28T11:04:41.743 回答