当使用TIMESTAMPTZ作为数据类型时,SpringBoot查询返回NULL,但该查询适用于其他数据类型,如时间戳等.我的日期格式类似于"2022-07-24 10:11:29.452+00".

下面添加了数据库屏幕截图.

enter image description here

另外,Date类型的定义如下

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "datem")
private Date datem;

该API调用以下代码

Date start = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2022-07-24 10:11:29.452+00");
Date end = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2022-07-24 10:11:49.452+00");

List<MqttMessageParsed> sensor_data = messageParsedRepository.findByCreatedAtBetween(start, end);

查询功能如下

@Query("SELECT t FROM MqttMessageParsed t WHERE t.datem BETWEEN :startDate AND :endDate") List<MqttMessageParsed> findByCreatedAtBetween(@Param("startDate")Date start, @Param("endDate")Date end);

API应该返回上述开始日期和结束日期之间的数据,但现在返回空值.我是不是遗漏了什么?

谢谢

推荐答案

Avoid legacy classes

您使用的是可怕的Date-Time类,多年前这些类已被现代的java.time类所取代.避免使用DateSimpleDateFormatTimestamp.

java.time

对于类似于SQL标准类型TIMESTAMP WITH TIME ZONE的列,请使用JDBC4.2及更高版本中的类OffsetDateTime.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

写作:

myPreparedStatement.setObject( … , odt);

几年前,Hibernate被更新为支持java.time.Jakarta Persistence,前身是Java Persistence API (JPA),情况也是如此.

ISO 8601

我建议您对您的输入的发布者进行培训,使其了解严格遵守日期-时间格式的ISO 8601标准的价值.

  • 将中间的空格替换为T.
  • 使用小时和分钟的完全偏移量,并用冒号分隔.

所以这就是:

"2022-07-24 10:11:29.452+00"

…应该是:

"2022-07-24T10:11:29.452+00:00"

…或者,也可以使用Z作为后缀来表示偏移量为零:

"2022-07-24T10:11:29.452Z"

如果您不能实现该更改,则定义一个自定义格式化模式来解析该非标准格式.使用DateTimeFormatter类,在堆栈溢出中已经多次讨论过了.


顺便说一句,要知道另一种数据类型,TIMESTAMP WITHOUT TIME ZONEcannot是用来记录时间线上的某个时刻的.此类型仅存储日期和一天中的时间,不存储时区或UTC偏移量的上下文.例如,考虑到go 年1月23日的中午12点,我们不知道这意味着日本东京的中午,法国图卢兹的中午,还是美国俄亥俄州托莱多的中午--三个不同的时刻相隔几个小时.

如果你需要跟踪什么时候发生的事情,一定要用TIMESTAMP WITH TIME ZONE.在Postgres的情况下,随输入提供的任何时区或偏移量信息用于调整为UTC(偏移量为零),然后丢弃.这一时刻是always stored in UTC,对于这种类型的波斯格雷斯.如果您关心原始时区,请将其存储在第二列中.

Postgresql相关问答推荐

PostgreSQL权限如何工作?需要从表格中 Select 收件箱

Postgres SQL:获取列值在连续日期之间已更改的行

在特定值的组聚合中添加标签列作为结果

无法在kubernetes中设置postgres复制

安装age-installation时出错

PostgreSQL临时文件的误解

gitlab在ubuntu上安装duplicate schema问题

ST_Intersects 太慢

postgres vacuum 是否改进了我的查询计划

在 Age Viewer 上看不到 node 的第一个属性

PostgresQL:获取两个数组之间的对应数量

转换数组类型

如何更改几何列的 SRID?

OpenShift:如何从我的 PC 连接到 postgresql

无法登录 PostgreSQL 数据库

如何使用 postgresql 中的存储过程将数据插入表中

如何使用 node-postgres 将多行正确插入 PG?

使用 pg-promise 插入多条记录

如何在 PostgreSQL 中插入多行

PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV