【发布时间】:2021-11-28 17:43:45
【问题描述】:
我有这张桌子:
CREATE TABLE IF NOT EXISTS client (
id BIGSERIAL NOT NULL,
ip VARCHAR(39) NOT NULL, -- 7+8x4=39
data TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT client_pk PRIMARY KEY(id),
CONSTRAINT client_uk UNIQUE (ip)
);
我想搜索两个不同日期之间的记录数:
@Transactional(readOnly=true)
public Long trovaIpTraDateEdOre(LocalDateTime dataOraInizialeInclusa, LocalDateTime dataOraFinaleEsclusa) {
try{
String sql = "SELECT COUNT(*) FROM client WHERE data >= TIMESTAMP WITH TIME ZONE ? AND data < TIMESTAMP WITH TIME ZONE ?;";
int[] tipi = {Types.TIMESTAMP_WITH_TIMEZONE, Types.TIMESTAMP_WITH_TIMEZONE};
return jdbcTemplate.queryForObject(sql, Long.class, tipi);
}catch (Exception e){
return null;
}
}
如果我运行这个查询,我会得到 7,所以问题出在其他地方:
SELECT COUNT(*) FROM client WHERE data >= TIMESTAMP WITH TIME ZONE '2021-10-07T00:00' AND data < TIMESTAMP WITH TIME ZONE '2022-01-01T00:00';
我不明白如何处理 LocalDateTime。
我得到'null'。在“尝试”循环中,我得到:
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT COUNT(*) FROM client WHERE data >= TIMESTAMP WITH TIME ZONE ? AND data < TIMESTAMP WITH TIME ZONE ?;]; Nessun valore specificato come parametro 2.; nested exception is org.postgresql.util.PSQLException: Nessun valore specificato come parametro 2.
【问题讨论】:
-
你遇到了什么错误?
-
我得到 org.springframework.dao.DataIntegrityViolationException。我在帖子中添加了错误。
-
对于jdbc类型TIMESTAMP_WITH_TIMEZONE应该使用
java.time.OffsetDatetime,参考jdbc specification B.4 Java Object Types Mapped to JDBC Types -
非常感谢您的反馈,我做了这个更改,但我没有解决:public Long trovaIpTraDateEdOre(OffsetDateTime dataOraInizialeInclusa, OffsetDateTime dataOraFinaleEsclusa) { 我忘记了什么?我得到同样的错误。
标签: postgresql spring-boot date jdbctemplate localdatetime