2017-01-10 8 views
0

Я использую Mongo и Oracle 12c одновременно.Как преобразовать ISO DATE в Timestamp в 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" : {} 
     } 

Я хочу использовать Timestamp тип формата в 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: эль не буквальному не совпадают против La Cadena де 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

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

Неверный. Этот шаблон форматирования соответствует входной строке. Игнорирует 'T' в середине стандартной строки ISO 8601. –

+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 или более поздней версии, вы можете передавать/получать объекты java.time через PreparedStatement::setObject/ResultSet::getObject методами.

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. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.