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

时间:2012-05-11 17:12:35

标签: java postgresql jdbc postgresql-9.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函数的List。

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

2 个答案:

答案 0 :(得分:2)

我找到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);

答案 1 :(得分: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