如何使用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,我们需要将时间与日期连接起来。
答案 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