4

「Oracle Database 11g Enterprise Edition リリース 11.2.0.2.0 - パーティション化、OLAP、データ マイニング、および Real Application Testing オプションを備えた 64 ビット プロダクション」を使用しています。

スキーマが次のテーブルがあります

COLUMN_NAME     DATA_TYPE   DATA_TYPE_MOD   DATA_TYPE_OWNER    DATA_LENGTH
CITY            VARCHAR2    (null)              (null)          30
COUNTRY         VARCHAR2    (null)              (null)          30
DATE_TYPE       DATE        (null)              (null)           7
PARTNO          NUMBER      (null)              (null)          22
STATE           VARCHAR2    (null)              (null)          30
ZIP             VARCHAR2    (null)              (null)          30

を取得するための単純な Java クライアントを作成しましたDATE_TYPE

 public class DateIssue {  
  private void testDateOutput() {  
       Connection con = null;  
       Statement psmt = null;  
       try {  
            con = getConnection();  
            con.setAutoCommit(true);     
            psmt = con.createStatement();  
            String sql = "SELECT DATE_TYPE FROM EMP";  
            ResultSet rs = psmt.executeQuery(sql);  
            while (rs.next()) {  
                 String dateString = rs.getString(1);  
                 System.out.println("As String :"+ dateString);  
            }  
            con.close();  
       }  
       catch (SQLException e) {  
            e.printStackTrace();  
       }  
  }  
  private static Connection getConnection() {  
       Connection connection = null;  
       try {  
            Class.forName("oracle.jdbc.pool.OracleDataSource");  
            java.util.Properties info = new java.util.Properties();  
            info.put("user", "myuser");  
            info.put("password", "mypass");  
            info.put("oracle.jdbc.mapDateToTimestamp", "false");  
       connection = DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:myservicename", info);  
       }  
       catch (ClassNotFoundException e) {  
            e.printStackTrace();  
       } catch (SQLException e) {  
            e.printStackTrace();  
       }  
       return connection;  
  }  
   public static void main(String rgs[]) throws Exception {  
       DateIssue di = new DateIssue();  
       di.testDateOutput();  
       System.out.println("----------------------------------------------------");  
  }  

ojdbc6.jar(12.1.0.1.0) の出力は次のとおりです。 ojdbc6.jar(11.2.0.2.0) の出力は次のとおり As String :2013-11-12
です。 As String :2013-11-12 11:10:09

Java バージョン: 1.7

ojdbc6.jar(12.1.0.1.0) で動作が変わるのはなぜですか? ojdbc6.jar(12.1.0.1.0) を使用した形式で出力が必要な場合は2013-11-12 11:10:09 どうすればよいですか?

4

3 に答える 3

7

日付を特定の文字列形式に暗黙的に変換するためにドライバーに依存しないでください。形式はドライバーの実装の詳細です。変換は自分で処理する必要があります。

これは、Java レベルで行うことができます。

/* executing the statement, etc. - snipped for clarity */
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (rs.next()) {  
    Date date = rs.getTimestamp(1);
    System.out.println("As String :"+ formatter.format(date));  
}

または、クエリ自体によって:

/* Setting up the connection, etc. - snipped for clarity */
String sql = "SELECT TO_CHAR(date_type, 'yyyy-mm-dd hh24:mi:ss') FROM emp";
ResultSet rs = psmt.executeQuery(sql);  
while (rs.next()) {  
    String dateString = rs.getString(1);  
    System.out.println("As String :" + dateString);      
}
于 2013-11-07T16:20:06.887 に答える
1

この問題の根本的な原因と思われる ResultSet#getDate() の動作が変更されています。

参照: ResultSet#getDate() セマンティクス

于 2014-03-19T09:42:15.947 に答える