java
  • oracle
  • date
  • jdbc
  • 2016-04-15 6 views 2 likes 
    2

    jdbcの中にNLS_DATE_FORMATを設定しようとしましたが、何の効果もないようです。 私のコード:NLS_DATE_FORMAT with JDBC

    //... 
    Connection conn = ods.getConnection(); 
    Statement stat = conn.createStatement(); 
    
    stat.execute("alter session set NLS_DATE_FORMAT='YYYY-DD-MM'"); 
    ResultSet rs = stat.executeQuery("select date_column from test_table"); 
    
    System.out.println(rs.getString(1)); // *** new format not effective here *** 
    //... 
    

    少し読んだ後。私は、NLS_DATE_FORMATがJDBCドライバでハードコードされていることを理解しています。これは正しいです ?結論はこれで作られた:

    言語および地域

    Thinドライバは、JVMのuser.languageプロパティのJavaロケールから言語と地域の設定(NLS_LANGUAGEとNLS_TERRITORY)を取得します。日付形式(NLS_DATE_FORMAT)は、地域設定に従って設定されます。

    Locale.setDefault(new Locale("en", "US")); 
    Connection conn = ods.getConnection(); 
    Statement stat = conn.createStatement(); 
    
    ResultSet rs = stat.executeQuery("select date_column from test_table"); 
    
    System.out.println(rs.getString(1)); // *** JVM format not effective here 
    

    しかし、それは働いていない:

    だから私はこれを試してみました。代わりに、私はOracle 11gのは、OracleのJDBCドライブ12.1を使用して

    2015-10-10 00:00:00.0 
    

    を取得

    10-OCT-15 (NLS_DATE_FORMAT for US = 'DD-MON-RR') 
    

    ような何かを得るための、JDBCドライバのJava 8

    +5

    'DATE'カラムの' ResultSet.getString() 'は、DBMS固有の" NLS設定 "を尊重することはありません。データベースから取得した日付の値に対して単にjava.sql.Timestamp.toString()を呼び出します。しかし、暗黙的なデータ型変換に頼ることは、まずは悪い考えです。 'getTimestamp()'を使い、 'SimpleDateFormat'を使ってあなたのJavaコードで必要な書式を適用するか、SELECT文中で' to_char() 'を使ってそれを書式化します。 –

    +0

    @a_horse_with_no_name toString()が呼び出されたと思います。しかし、Data.toStringのdocをチェックすると、日付を日付エスケープ形式yyyy-mm-ddでフォーマットします。それは実際に私が持っているフォーマットではない?どう思いますか ?ありがとう – iman

    +0

    'java.sql.Date.toString()'はそのフォーマットを返します。組み込みです。 'System.out.pringln(新しいjava.sql.Date(0).toString())'を試すことができます。 'java.sql.Timestamp'でも同じことが当てはまります –

    答えて

    3

    NLSサポートはdropped in Oracle 10gました。それにもかかわらず、あなたの日付をフォーマットするためのOracle固有のNLS機能に頼らないことをお勧めします。 SimpleDateFormatのインスタンスが再利用可能であることを

    Connection conn = ods.getConnection(); 
    Statement stat = conn.createStatement(); 
    
    ResultSet rs = stat.executeQuery("select date_column from test_table"); 
    
    DateFormat format = new SimpleDateFormat('yyyy-dd-MM'); 
    System.out.println(format.format(rs.getDate(1)); 
    

    注しかしスレッドセーフではない:

    は、Javaのいずれかのデータベースから取得した日付をフォーマットするには、これを行います。

    Java 8を使用している場合は、代わりに新しく改良されたJava Time APIを使用することができます。残念ながら、ResultSetはまだDateTimeのインスタンスを返すように更新されていないため、変換する必要があります。古いものから新しいものへの変換方法についてDateTimeFormatterおよびthis questionをチェックしてください。とりわけ、DateTimeFormatterは完全なスレッドセーフです。

    古いスタイルと新しいスタイルの両方のフォーマットパターンは同じです。新しいものはhere are the docsです。

    +1

    準拠したJDBC 4.2ドライバは、['getObject(int、Class )'](http://docs.oracle.com)を介して 'java.time' APIをサポートする必要があります。com/javase/8/docs/api/java/sql/ResultSet.html#getObject-int-java.lang.Class-)と関連するメソッドについて説明します。したがって、 'ResultSet.getObject(1、LocalDate.class)'は動作する必要があります。 getLocalDateなどのメソッドでAPIをさらに拡張しないという決定が下されました。 –

    +0

    @JakeRobb私はこれをすべて知っています。しかし、私はgetDate()を使用することはできません。すべてのデータを文字列として取得する必要があります。私はいくつかの新しいテストを行った。実際には:stat.executeQuery( "INSERT INTO tesy_table values(" 10-OCT-15 ")は正常に動作しています)これはJDBCがJVMのNLS_DATE_FORMATに依存していることを意味しますが、SELECTのために機能しない理由はわかりません。 – iman

    +1

    @iman : "*私はすべてのデータを文字列として取り出す必要があります。" - 違反はしませんが、それはばかです。 –

    関連する問題