2017-01-10 9 views
0

私はMongoとOracle 12cを同時に使用しています。ISO DATEをJavaまたはSQLでタイムスタンプに変換する方法は?

MongoDBの場合、私はISO DATEを使用していますが(Stringのように)、日付を保持しています。このように:

{ 
      "_id" : null, 
      "fields" : { 
       "Status" : "UnderInvestigation", 
       "Assignee" : "", 
       "CreationDate" : "2016-12-14T00:00:00Z", //ISO DATE 
       "CaseId" : "8165021", 
       "RunningMode" : "STS", 
       "CloserDueDate" : "" 
      }, 
      "domain" : {}, 
      "arrays" : {} 
     } 

私は、同じ名前の列は、Oracleにタイムスタンプのフォーマットタイプを使用したいので、アイデアは、タイムスタンプにその日付を変換です。

私はそれを行う方法がわかりません。私は、次のコードがありますが、動作しません。

final String query = "INSERT INTO " + TABLE_APPLICATION + " (CreationDate) VALUES (TO_DATE(?,'YYYY-MM-DD HH24:MI:SS'))" ; 
PreparedStatement ps = getPreparedStatement(); 
((OraclePreparedStatement) ps).setString(1, getValueFromJson(JSON, 'fields.CreationDate')); 

しかし、私が得た:

java.sql.SQLDataException:ORA-01861:エルは何の一致をリテラルない詐欺ラ・カデナ・デ・フォーマト

問題は何ですか?

+2

[このようなOracle](http://stackoverflow.com/a/28211019/266304);タイトルはあなたがJavaでやりたがっていると言っています。本当に意味がありますか?また、どのデータ型が列であり、UTCの値を現地時間に変換する予定ですか?日付で、調整したくない場合は、 'to_date()'と同じ書式マスクを使用できますが、それは厳密に正しいとは限りません。 –

+1

'getFieldFromJson'メソッドでコードがどのように設定されていますか? Mongo javaドライバを使ってマッピングを処理していますか? mongo dbに日付型として日付を格納しようとする必要があります。だから変換する必要はありませんし、MongoDBから読み込んでOracleに保存するだけです。 – Veeram

答えて

2

Oracleソリューション:

SELECT TO_TIMESTAMP_TZ(
     '2016-12-14T00:00:00Z', 
     'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM' 
     ) 
FROM DUAL; 

だからあなたのコードは次のようになります。Javaのではなく、SQLでこれを行うには

final String query = "INSERT INTO " + TABLE_APPLICATION + " (" 
         + "CreationDate" 
         + ") VALUES (" 
         + "TO_TIMESTAMP_TZ(?, 'YYYY-MM-DD\"T\"HH24:MI:SSTZH:TZM')" 
         + ")"; 
1

I SimpleDateFormatフィールドのDateとgetTime()を解析すると、正確にmillisTimeが返されます。

//String base = "YYYY-MM-ddTkk:mm:ssZ"; 
//"date": "2016-11-22T16:59:01+01:00" 

String timeform = "YYYY-MM-dd-kk-mm-ss-Z"; 
Date datec = new Date(); 

//si null ont crée une nouvelle date 
if (!json.isNull("date")) 
{ 
    DateFormat format = new SimpleDateFormat(timeform, Locale.FRANCE); 
    try { 
     datec = format.parse(json.getString("date")); 
    } catch (ParseException e){} 
} 
datec.getTime(); 
+1

が正しくありません。その書式設定パターンは入力文字列と一致します。標準ISO 8601フォーマット文字列の真中の 'T 'を無視します。 –

+0

@ GyGy19私はこのコードを使用すると日付が変わることに同意します:( – cheloncio

0

java.time

、Javaのを使用しています。タイムクラス。

Instantクラスは、nanoseconds(小数点以下9桁まで)の解像度を持つUTCのタイムライン上の瞬間を表します。

入力文字列は、標準ISO 8601形式です。 java.timeクラスは、デフォルトでこれらの標準形式を使用します。したがって、書式設定パターンを指定する必要はありません。

Instant instant = Instant.parse("2016-12-14T00:00:00Z"); 

あなたのJDBCドライバは、JDBC 4.2以降をサポートしている場合、あなたはPreparedStatement::setObject/ResultSet::getObject方法を介してjava.timeオブジェクトをフェッチ/渡すことができます。

myPreparedStatement.setObject(1 , instant); 

おそらくSQLTypeを指定する必要があります。

myPreparedStatement.setObject(1 , instant , JDBCType.TIMESTAMP_WITH_TIMEZONE); 

JDBCドライバでjava.time型が指定されていない場合は、古いjava.sql型を使用します。変換のために古いクラスに追加された新しいメソッドを呼び出します。

java.sql.Timestamp ts = java.sql.Timestamp.from(instant); 
myPreparedStatement.setTimestamp(1 , ts); 

あなたの質問は実際には他の多くのものと重複しています。これらのクラス名のためにスタックオーバーフローを検索すると、より多くの例と議論が得られます。


javaについて時間

java.timeフレームワークはJava 8以降に組み込まれています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題