Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从Java中的结果集中获取日期值_Java_Oracle_Date_Jdbc - Fatal编程技术网

无法从Java中的结果集中获取日期值

无法从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

我正在尝试使用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 = 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 ) ;