如何在Java或SQL中将ISO DATE转换为Timestamp?

时间:2017-01-10 14:21:35

标签: java oracle mongodb timestamp isodate

我同时使用Mongo和Oracle 12c。

对于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中使用Timestamp格式类型来获取具有相同名称的列,因此我们的想法是将该日期转换为时间戳。

我不知道该怎么做。我有以下代码,但它不起作用。

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 literal no conide con la cadena de formato

问题是什么?

3 个答案:

答案 0 :(得分: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 :(得分:1)

我SimpleDateFormat解析你的字段Date和getTime()你返回millisTime exact。

//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();

答案 2 :(得分:0)

java.time

要在Java而不是SQL中执行此操作,请使用java.time类。

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

你的问题确实与许多其他问题重复。搜索这些类名称的Stack Overflow以获得更多示例和讨论。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore