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

时间:2018-02-20 06:44:56

标签: java oracle date jdbc

我正在尝试使用resultset从Oracle数据库中检索日期值。日期格式类似于dd-mmm-yy(如17-MAY-18)。此列名称为VALID_TO。默认值设置为TO_DATE 01.01.4000在DB中。我正在编写如下代码。

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。

1 个答案:

答案 0 :(得分:1)

TL;博士

  • 使用 java.time 类而不是旧版日期时间类。具体而言,LocalDate仅限日期值。
  • 在SQL和预准备语句中使用占位符。
  • 直接通过JDBC 4.2传递 java.time 对象。

示例:

myPreparedStatement.setObject( 1 , startLocalDate ) ;
myPreparedStatement.setObject( 2 , stopLocalDate ) ;

...和...

myResultSet.getObject( … , LocalDate.class) 

java.time

使用JDBC 4.2及更高版本,您可以使用数据库而不是哑字符串交换智能对象。

占位符

使用占位符而不是文字来设置准备好的语句。

String sql = "SELECT * FROM tbl WHERE fromCol >= ? AND toCol < ? ;" ;

LocalDate

设置值以填充这些占位符。对于仅限日期的列,例如SQL标准类型DATE,请使用java.time.LocalDate类。 LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate start = LocalDate.of( 2018 , Month.JANUARY , 1 ) ;  // First of January 2018.

半开

通常最好在日期工作中使用半开放方法来定义时间跨度,其中开头是包含,而结尾是独占。因此,如果您想要整月1月,则查询&#34;等于或晚于该月的第一天,并且小于跟随月&#34;的第一天。

LocalDate stop = start.plusMonths( 1 ) ;           // First of February 2018.

或者,通过使用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&amp; ResultSet

无论哪种方式,我们现在都有一对LocalDate个对象可以提供给我们准备好的声明的占位符。

myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;

从结果集中检索时:

LocalDate start = myResultSet.getObject( … , LocalDate.class ) ;

避免遗留日期时间类

不需要java.util.Datejava.sql.Date或任何其他与最早版本的Java捆绑在一起的设计糟糕的黑客日期时间类。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore