Java JDBCResultSet:我需要一个getDateTime,但只有getDate和getTimeStamp
我想从带有JDBC的Oracle DB表中获取DATETIME列。这是我的密码:Java JDBCResultSet:我需要一个getDateTime,但只有getDate和getTimeStamp,java,sql,oracle,resultset,getdate,Java,Sql,Oracle,Resultset,Getdate,我想从带有JDBC的Oracle DB表中获取DATETIME列。这是我的密码: int columnType = rsmd.getColumnType(i); if(columnType == Types.DATE) { Date aDate = rs.getDate(i); valueToInsert = aDate.toString(); } else if(columnType == Types.TIMESTAMP) { Timestamp aTimeStamp
int columnType = rsmd.getColumnType(i);
if(columnType == Types.DATE)
{
Date aDate = rs.getDate(i);
valueToInsert = aDate.toString();
}
else if(columnType == Types.TIMESTAMP)
{
Timestamp aTimeStamp = rs.getTimestamp(i);
valueToInsert = aTimeStamp.toString();
}
else
{
valueToInsert = rs.getString(i);
}
我必须首先确定列类型。我感兴趣的字段被认为是Types.DATE,但它在数据库中实际上是DATETIME,因为它有以下格式:“07.05.2009 13:49:32”
getDate截断时间:“07.05.2009”
getString在其后面附加“.0”:“07.05.2009 13:49:32.0”
当然,我可以删除final.0并一直使用getString,但这是一个肮脏的解决方法
有什么想法吗?我正在寻找getDateTime方法
干杯,
提姆
然后按您喜欢的方式格式化。是正确的,但现在已经过时,使用了一个麻烦的旧日期时间类,java.sql.Timestamp
tl;博士
它实际上是数据库中的日期时间
不,不是。Oracle数据库中没有DATETIME
这样的数据类型
我正在寻找getDateTime方法
使用JDBC 4.2及更高版本中的java.time类,而不是您在问题中看到的麻烦的遗留类。特别是,不要使用java.sql.TIMESTAMP
,而是暂时使用Instant
类,例如带有时区的sql标准类型TIMESTAMP
人为代码段:
if(
JDBCType.valueOf(
myResultSetMetaData.getColumnType( … )
)
.equals( JDBCType.TIMESTAMP_WITH_TIMEZONE )
) {
Instant instant = myResultSet.getObject( … , Instant.class ) ;
}
奇怪的是,JDBC 4.2规范不需要支持两个最常用的java.time类,Instant
和ZonedDateTime
。因此,如果您的JDBC不支持上述代码,请改用OffsetDateTime
OffsetDateTime offsetDateTime = myResultSet.getObject( … , OffsetDateTime.class ) ;
细节
我想从带有JDBC的Oracle DB表中获取DATETIME列
根据,Oracle数据库中没有列数据类型DATETIME
。这个术语似乎是甲骨文的一个词,指的是所有的日期时间类型
我看不出您的代码检测数据类型的类型和分支的意义。通常,我认为您应该在特定表和特定业务问题的上下文中显式地编写代码。也许这在某种通用框架中是有用的。如果您坚持,请继续阅读以了解各种类型,并了解java 8及更高版本中内置的非常有用的新java.time类,这些类取代了问题中使用的类
智能对象,而不是哑字符串
valueToInsert=aDate.toString()
您似乎试图将日期时间值作为文本、字符串和对象与数据库交换。不要
要与数据库交换日期时间值,请使用日期时间对象。现在在Java8和更高版本中,这意味着Java.time对象,如下所述
各种类型的系统
您可能会混淆三组与日期时间相关的数据类型:
- 标准SQL类型
- 专有类型
- JDBC类型
日期
不带时区的时间
带时区的时间
不带时区的时间戳
带时区的时间戳
日期
仅日期,无时间,无时区李>
或时间
不带时区的时间
仅限时间,无日期。以静默方式忽略指定为输入一部分的任何时区时区时间(或
)TIMETZ
仅限时间,无日期。如果输入中包含足够的数据,则应用时区和夏令时规则。考虑到其他数据类型,如
或不带时区的时间戳
时间戳
日期和时间,但忽略时区。传递到数据库的任何时区信息都将被忽略,而不调整UTC。因此,这个并不代表时间轴上的特定时刻,而是26-27小时内的一系列可能时刻。如果时区或偏移量(a)未知或(b)不相关,例如“我们在世界各地的所有工厂中午都关门吃午饭”,请使用此选项李>
(或带时区的时间戳
)时间戳
关于时区的日期和时间。请注意,根据实现情况,这个名称有点用词不当。某些系统可能存储给定的时区信息。在其他系统中,如时区信息不存储,而是将传递到数据库的时区信息用于将日期时间调整为UTC
只模拟日期,假装没有时间,没有时区。这个类是跟踪日期和时间的java.util.Date的包装,这可能会让人困惑。在内部,时间部分设置为零(UTC午夜)
只有时间,假装没有日期,也没有时区。这个类也是一个围绕java.util.Date的薄包装器,它跟踪日期和时间,这也可能会让人困惑。在内部,日期设置为零(1月)OffsetDateTime offsetDateTime = myResultSet.getObject( … , OffsetDateTime.class ) ;
myPreparedStatement.setObject( … , instant ) ;
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZoneId zAuckland = ZoneId.of( "Pacific/Auckland" ) ; ZonedDateTime zdtAuckland = instant.atZone( zAuckland ) ;
ZoneId zMontréal = ZoneId.of( "America/Montreal" ) ; ZonedDateTime zdtMontréal = zdtAuckland.withZoneSameInstant( zMontréal ) ; // Or, for the same effect: instant.atZone( zMontréal )
final int columnType = myResultSetMetaData.getColumnType( … ) ; final JDBCType jdbcType = JDBCType.valueOf( columnType ) ; switch( jdbcType ) { case DATE : // FYI: Qualified type name `JDBCType.DATE` not allowed in a switch, because of an obscure technical issue. Use a `static import` statement. … break ; case TIMESTAMP_WITH_TIMEZONE : … break ; default : … break ; }
//java.sql.Timestamp timestamp = resultSet.getTimestamp(i); // Or, fake it // long m = DateTime.now().getMillis(); // java.sql.Timestamp timestamp = new java.sql.Timestamp( m ); //DateTime dateTimeUtc = new DateTime( timestamp.getTime(), DateTimeZone.UTC ); DateTime dateTimeUtc = new DateTime( DateTimeZone.UTC ); // Defaults to now, this moment. // Convert as needed for presentation to user in local time zone. DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); DateTime dateTimeZoned = dateTimeUtc.toDateTime( timeZone );
System.out.println( "dateTimeUtc: " + dateTimeUtc ); System.out.println( "dateTimeZoned: " + dateTimeZoned );
dateTimeUtc: 2014-01-16T22:48:46.840Z dateTimeZoned: 2014-01-16T23:48:46.840+01:00
Date date = null; String dateStr = rs.getString("doc_date"); if (dateStr != null) { date = dateFormat.parse(dateStr); }
String l_mysqlQuery = "SELECT DATE_FORMAT(time, '%Y-%m-%d %H:%i:%s') FROM uld_departure;" l_importedTable = fStatement.executeQuery( l_mysqlQuery ); System.out.println(l_importedTable.getString( timeIndex));
String l_mysqlQuery = "SELECT time FROM uld_departure;" l_importedTable = fStatement.executeQuery( l_mysqlQuery ); System.out.println(l_importedTable.getString( timeIndex));