无法从Java中的结果集中获取日期值
我正在尝试使用resultset从Oracle数据库检索日期值。日期的格式类似于dd mmm yy(如2018年5月17日)。第列名称在此处有效。默认值设置为数据库中的日期01.01.4000。我正在编写如下代码无法从Java中的结果集中获取日期值,java,oracle,date,jdbc,Java,Oracle,Date,Jdbc,我正在尝试使用resultset从Oracle数据库检索日期值。日期的格式类似于dd mmm yy(如2018年5月17日)。第列名称在此处有效。默认值设置为数据库中的日期01.01.4000。我正在编写如下代码 String sql_qry = "SELECT a.VALID_TO from table1 a where a.VALID_FROM > '01-JAN- 18' and a.VALID_TO > '31-JAN-18'"; this.preparedStatement
String sql_qry = "SELECT a.VALID_TO from table1 a where a.VALID_FROM > '01-JAN-
18' and a.VALID_TO > '31-JAN-18'";
this.preparedStatement = dbconnection.prepareStatement(sql_qry);
ResultSet rs = this.preparedStatement.executeQuery();
while (rs.next()) {
AccountDetails detailsVo = new AccountDetails();
detailsVo.setDateColumn(rs.getDate("VALID_TO"));
accountDetails.add(detailsVo);
}
我得到的是默认值01.01.4000,而不是数据库中的实际日期。如何获取实际值。我在上面导入了java.sql.date。tl;博士
- 使用java.time类,而不是传统的日期时间类。具体来说,
用于仅日期值LocalDate
- 在SQL和准备好的语句中使用占位符
- 通过JDBC4.2直接传递java.time对象
myPreparedStatement.setObject( 1 , startLocalDate ) ;
myPreparedStatement.setObject( 2 , stopLocalDate ) ;
……还有
myResultSet.getObject( … , LocalDate.class)
java.time
使用JDBC4.2及更高版本,您可以与数据库交换智能对象,而不是哑字符串
占位符
使用占位符而不是文字设置准备好的语句
String sql = "SELECT * FROM tbl WHERE fromCol >= ? AND toCol < ? ;" ;
半开
通常,日期-时间工作最好使用半开放的方法来定义时间跨度,其中开始是包含的,而结束是独占的。因此,如果您想要整个一月,查询“等于或晚于一月的第一天,并且小于下个月的第一天”
或者,通过使用YearMonth
类来表示整个月份,您的意图可能会更清楚
YearMonth ym = YearMonth.of( 2018 , 1 ) ; // January 2018.
LocalDate start = ym.atDay( 1 ) ; // First of January 2018.
LocalDate stop = ym.plusMonths( 1 ).atDay( 1 ) ; // First of February 2018.
PreparedStatement
和ResultSet
无论哪种方式,我们现在都有一对LocalDate
对象要输入到我们准备好的语句的占位符中
myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;
从结果集中检索时:
LocalDate start = myResultSet.getObject( … , LocalDate.class ) ;
避免遗留日期时间类
不需要java.util.Date
,java.sql.Date
,也不需要任何其他设计糟糕的hack-Date-time类与最早版本的java捆绑在一起
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 使用兼容的或更高版本,您可以直接与数据库交换java.time对象。不需要字符串,也不需要java.sql.*类 从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。您在哪里格式化日期?SQL语句在哪里?顺便说一句,这里缺少很多内容:数据库中
date
的列定义;setDateColumn()
的代码;您用来打印日期的代码01/01/4000
@MauricePerry抱歉我错过了它。我已经编辑了这个问题。请您帮我回答另一个问题“为什么我的数据库会做这种奇怪的事情?”通常情况下,数据库并不是在做一件奇怪的事情,只是数据库的实际状态与您认为的状态之间存在一些差距。我的猜测是,数据与您预期的不同,可能是因为您没有做出更改。或者您已将有效的_填充到没有世纪(即年=0018
),这在使用YY
格式掩码而不是yyy
时始终是一种危险。
myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;
LocalDate start = myResultSet.getObject( … , LocalDate.class ) ;