在db中查找一条记录,其范围为Java中的OffsetDateTime
我的postgres数据库中有一个日期列,我希望能够找到具有给定日期范围的记录 例如,在我的数据库中,我有一个记录在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代码中修复它,
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 ) ;