2017-01-10 86 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

相关问题