在db中查找一条记录,其范围为Java中的OffsetDateTime

在db中查找一条记录,其范围为Java中的OffsetDateTime,java,postgresql,jdbc,Java,Postgresql,Jdbc,我的postgres数据库中有一个日期列,我希望能够找到具有给定日期范围的记录 例如,在我的数据库中,我有一个记录2018-10-29 09:05:30.100updatetime列。我想找到OffsetDateTime+-5秒的记录 Duration d = Duration.ofSeconds( 5 ) ; OffsetDateTime start = odt.minus( d ) ; OffsetDateTime stop = odt.plus( d ) ; 如何在Java代码中修复它,

我的postgres数据库中有一个日期列,我希望能够找到具有给定日期范围的记录

例如,在我的数据库中,我有一个记录
2018-10-29 09:05:30.100
updatetime
列。我想找到OffsetDateTime+-5秒的记录

Duration d = Duration.ofSeconds( 5 ) ;
OffsetDateTime start = odt.minus( d ) ;
OffsetDateTime stop = odt.plus( d ) ;
如何在Java代码中修复它,让db在
2018-10-29 09:05:25.100
2018-10-29 09:05:35.100之间获取记录?(在该范围内只能有一条记录,所以不要担心结果。)

这应该有效

String sqlQuery = "select * from table_name where updatetime <= '" 
           + yourDatetime.toString() +
           "'::timestamp with time zone + interval '5 second' and updatetime >= '" + 
           + yourDatetime.toString() + "'::timestamp with time zone - interval '5 second'";
旁注:您可以相应地创建
sqlQuery
,以生成您准备好的语句

如果使用课堂,你必须对时间轴上的时刻、实际点感兴趣。如果是这样,数据库列应该是带有时区的数据类型
TIMESTAMP
(而不是不带时区的

但奇怪的是,您的示例数据缺少小时分秒数。必须指定偏移量或(
ZoneId
&
zoneDateTime
)来确定时刻

我将通过指定任意偏移量来调整输入字符串

OffsetDateTime odt = OffsetDateTime.parse( "2018-10-29T09:05:30.100+02:00" );
调整至±5秒

Duration d = Duration.ofSeconds( 5 ) ;
OffsetDateTime start = odt.minus( d ) ;
OffsetDateTime stop = odt.plus( d ) ;
从JDBC4.2开始,我们可以直接与数据库交换java.time对象

在这里,我们使用通用的半开放方法来定义时间跨度。开始是包含的,而结束是独占的。请注意,我们不在
之间使用SQL命令

String sql = "SELECT * FROM event WHERE when >= ? AND when < ? ;" ;
PreparedStatement pstmt = con.prepareStatement( sql ) ;
pstmt.setObject( 1 , start ) ;
pstmt.setObject( 2 , stop ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(您尝试了什么,发生了什么?@MarkRotteveel这是我提出的问题的一个可能的解决方案,但我不确定是否有办法。我搜索了它,但没有找到任何类似的方法。您是否尝试过使用
      where yourdatecolumn?和?
      并设置offsetdatetimes?另请参见:确切的数据类型是什么在该列中?它是带时区的时间戳
,还是不带时区的时间戳
?您谈到使用OffsetDateTime,但是您的示例数据缺少offset-from-UTC.FYI,非常麻烦的旧日期时间类,例如,
java.text.SimpleDateFormat
,现在被构建的类取代t转换为Java8及更高版本。请参阅。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;