2017-01-10 83 views
0

我在同一時間使用Mongo和Oracle 12c。如何在ISO或SQL中將ISO DATE轉換爲時間戳?

對於MongoDB我使用ISO DATE(但像字符串)來保存日期。就像這樣:

{ 
      "_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:EL文字不相吻合CON LA卡德納德formato

什麼問題?

+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; 

所以,你的代碼應該是:

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

我SimpleDateFormat解析您的字段日期和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我同意,日期更改如果EL使用此代碼:( – cheloncio

0

java.time

要做到這一點在Java中,而不是SQL,使用java。時間課程。

Instant類表示UTC中的時間軸上的一個時刻,分辨率爲nanoseconds(最多九(9)位小數)。

您的輸入字符串採用標準的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及更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

相關問題