我正在尝试使用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。
答案 0 :(得分:1)
LocalDate
仅限日期值。示例:
myPreparedStatement.setObject( 1 , startLocalDate ) ;
myPreparedStatement.setObject( 2 , stopLocalDate ) ;
...和...
myResultSet.getObject( … , LocalDate.class)
使用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.Date
,java.sql.Date
或任何其他与最早版本的Java捆绑在一起的设计糟糕的黑客日期时间类。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。