Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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 JDBCResultSet:我需要一个getDateTime,但只有getDate和getTimeStamp_Java_Sql_Oracle_Resultset_Getdate - Fatal编程技术网

Java JDBCResultSet:我需要一个getDateTime,但只有getDate和getTimeStamp

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

我想从带有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 = 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类型
SQL标准类型 SQL标准:

  • 日期
  • 不带时区的时间
  • 带时区的时间
  • 不带时区的时间戳
  • 带时区的时间戳
仅日期
  • 日期

    仅日期,无时间,无时区
仅限一天中的某个时间
  • 时间
    不带时区的时间

    仅限时间,无日期。以静默方式忽略指定为输入一部分的任何时区
  • 时区时间(或
    TIMETZ

    仅限时间,无日期。如果输入中包含足够的数据,则应用时区和夏令时规则。考虑到其他数据类型,如
日期和时间
  • 时间戳
    或不带时区的
    时间戳

    日期和时间,但忽略时区。传递到数据库的任何时区信息都将被忽略,而不调整UTC。因此,这个并不代表时间轴上的特定时刻,而是26-27小时内的一系列可能时刻。如果时区或偏移量(a)未知或(b)不相关,例如“我们在世界各地的所有工厂中午都关门吃午饭”,请使用此选项
  • 带时区的时间戳
    (或
    时间戳

    关于时区的日期和时间。请注意,根据实现情况,这个名称有点用词不当。某些系统可能存储给定的时区信息。在其他系统中,如时区信息不存储,而是将传递到数据库的时区信息用于将日期时间调整为UTC
专有的 许多数据库提供自己的日期时间相关类型。专有类型差异很大。有些是旧的遗留类型,应该避免。供应商认为有些产品可以提供某些好处;您可以决定是否只使用标准类型。注意:某些专有类型的名称与标准类型冲突;我看着你

JDBC Java平台处理日期时间的内部细节与SQL标准或特定数据库不同。a的工作是在这些差异之间进行调解,充当桥梁,根据需要转换类型及其实际实现的数据值。桥就是那座桥

JDBC遗留类 在Java8之前,规范为日期时间工作定义了3种类型。前两个是hack,在版本8之前,Java缺少任何类来表示仅日期或仅时间的值


  • 只模拟日期,假装没有时间,没有时区。这个类是跟踪日期和时间的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));